`mktemp -d` 다음에 `pushd`가 오는 경우 명령줄에서는 제대로 작동하지만 스크립트에서는 작동하지 않습니다.

`mktemp -d` 다음에 `pushd`가 오는 경우 명령줄에서는 제대로 작동하지만 스크립트에서는 작동하지 않습니다.

데비안의 명령 프롬프트에 이 줄을 붙여 넣으면...

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 )

관련 정보