我有一个从非常特定的目录中调用的通用命令。这个程序只有一个可执行文件在/bin 中,当前的工作目录对于正确运行它非常重要。该脚本会影响运行它的目录中的文件。
现在,我还有一个定制的 shell 脚本,它在一个目录中执行一些操作,但是我需要调用上面提到的命令,就好像它在另一个目录中一样。
如何在 shell 脚本中实现这一点?
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
在子 shell 中使用 cd; 使用这种子 shell 的简便方法是使用括号。
cd
(cd wherever; mycommand ...)
也就是说,如果你的命令有一个它需要的环境,它应该确保环境本身,而不是把责任推给任何可能想要使用它的东西(除非它是一个内部命令,在一个定义良好的大系统的上下文中,在非常特定的情况下使用,这样任何调用者已经需要确保它需要的环境)。通常这是某种 shell 脚本包装器。
你可以使用 cd内建函数,或者 pushd和 popd内建函数来实现这个目的。例如:
pushd
popd
# do something with /etc as the working directory cd /etc : # do something with /tmp as the working directory cd /tmp :
您可以像使用其他命令一样使用内置程序,并且可以在脚本中随意更改目录上下文。
current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
current_dir
pwd
或者
pushd && cd /path/to/your/command/dir && special command ARGS && popd
感谢@apieceofbart 和@Konstantin
提供一点有用的信息:
这将把 shell 目录更改为 ~/project
~/project
function mymake() { cd ~/project && make $1 }
不会的
function mymake() ( cd ~/project && make $1 )
逃跑
mymake something