web-dev-qa-db-ja.com

`mktemp-d`の後に` pushd`が続く場​​合、コマンドラインでは正常に機能しますが、スクリプト内では機能しません

これらの行をDebianのコマンドプロンプトに貼り付けると...

DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
echo "tmpdir = $DIR"
cd "$DIR"

彼らは新しい一時ディレクトリを作成し、ディレクトリ名を出力してから、そのディレクトリにpushdを作成します。

root@beaglebone:/tmp/bbbrtc.2mw02x# DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
root@beaglebone:/tmp/bbbrtc.2mw02x# echo "tmpdir = $DIR"
tmpdir = /tmp/bbbrtc.Grti6K
root@beaglebone:/tmp/bbbrtc.2mw02x# pushd "$DIR"
/tmp/bbbrtc.Grti6K /tmp/bbbrtc.2mw02x ~/bbbphyfix
root@beaglebone:/tmp/bbbrtc.Grti6K# 

... 予想通り。

シェルスクリプト内からまったく同じコマンドを実行すると...

root@beaglebone:/tmp/bbbrtc.2mw02x# cat test.sh
#!/bin/sh

DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
echo "tmpdir = $DIR"
pushd "$DIR"

root@beaglebone:/tmp/bbbrtc.2mw02x# ./test.sh
tmpdir = /tmp/bbbrtc.O6yYgf
./test.sh: 5: ./test.sh: pushd: not found
root@beaglebone:/tmp/bbbrtc.2mw02x#

...「pushd:notfound」メッセージを生成します。

これらのコマンドがシェルスクリプト内から機能しないのはなぜですか。また、スクリプトで一時ディレクトリを作成してから、その新しいディレクトリにpushdするのが適切な方法は何ですか?

1
bigjosh

pushdbashコマンドであり、通常は/bin/shによって実装されません。 pushdスクリプトでshを使用するには、同じ機能を持つスクリプトまたは関数を提供する必要があります。

shスクリプト内のいくつかのコマンドの過程で作業ディレクトリを一時的に変更する慣用的な方法は、次のことです。

( cd directory && somecommand )

これはdirectoryに変更され、成功した場合はsomecommandを実行します。すべてがサブシェルで行われるため、cdはスクリプトの残りの部分に影響を与えません。

または、

( cd directory || exit 1
  command1
  command2
  command3 )
2
Kusalananda