`mktemp -d`の後に `pushd`が続く場​​合、コマンドラインではうまくいきますが、スクリプトではうまくいきません。

`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:見つかりません」というメッセージが生成されます。

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

答え1

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

スクリプトで複数のコマンドが実行されている間に作業ディレクトリを一時的に変更する慣用的な方法は次のshとおりです。

( cd directory && somecommand )

成功すると、これがdirectory実行されます。somecommandすべての操作はサブシェルで実行されるため、cd残りのスクリプトには影響しません。

または、

( cd directory || exit 1
  command1
  command2
  command3 )

関連情報