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/sh
。pushd
スクリプトで使用するには、sh
同じ機能を持つスクリプトまたは関数を提供する必要があります。
スクリプトで複数のコマンドが実行されている間に作業ディレクトリを一時的に変更する慣用的な方法は次のsh
とおりです。
( cd directory && somecommand )
成功すると、これがdirectory
実行されます。somecommand
すべての操作はサブシェルで実行されるため、cd
残りのスクリプトには影響しません。
または、
( cd directory || exit 1
command1
command2
command3 )