これらの行を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
するのが適切な方法は何ですか?
pushd
はbash
コマンドであり、通常は/bin/sh
によって実装されません。 pushd
スクリプトでsh
を使用するには、同じ機能を持つスクリプトまたは関数を提供する必要があります。
sh
スクリプト内のいくつかのコマンドの過程で作業ディレクトリを一時的に変更する慣用的な方法は、次のことです。
( cd directory && somecommand )
これはdirectory
に変更され、成功した場合はsomecommand
を実行します。すべてがサブシェルで行われるため、cd
はスクリプトの残りの部分に影響を与えません。
または、
( cd directory || exit 1
command1
command2
command3 )