데비안의 명령 프롬프트에 이 줄을 붙여 넣으면...
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 )