![`mktemp -d` 后跟 `pushd` 在命令行上工作正常,但在脚本中则不行](https://linux22.com/image/134137/%60mktemp%20-d%60%20%E5%90%8E%E8%B7%9F%20%60pushd%60%20%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E5%B7%A5%E4%BD%9C%E6%AD%A3%E5%B8%B8%EF%BC%8C%E4%BD%86%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%88%99%E4%B8%8D%E8%A1%8C.png)
如果我将这些行粘贴到 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 )