如果我将这些行粘贴到 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 )