`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# 

...正如预期的那样。

如果我从 shell 脚本内部运行完全相同的命令...

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:未找到”消息。

为什么这些命令在 shell 脚本内部不起作用,以及让脚本创建临时目录然后pushd进入该新目录的正确方法是什么?

答案1

pushd是一个bash命令,一般不被实现/bin/sh。要pushd在脚本中使用sh,您必须提供具有相同功能的脚本或函数。

在脚本中的几个命令过程中临时更改工作目录的惯用方法sh

( cd directory && somecommand )

如果成功的话,这将变为directory并执行。somecommand整个事情是在子 shell 中完成的,因此cd不会对脚本的其余部分产生任何影响。

或者,

( cd directory || exit 1
  command1
  command2
  command3 )

相关内容