Bash 如何在不同的目录上下文中执行命令?

我有一个从非常特定的目录中调用的通用命令。这个程序只有一个可执行文件在/bin 中,当前的工作目录对于正确运行它非常重要。该脚本会影响运行它的目录中的文件。

现在,我还有一个定制的 shell 脚本,它在一个目录中执行一些操作,但是我需要调用上面提到的命令,就好像它在另一个目录中一样。

如何在 shell 脚本中实现这一点?

164795 次浏览
(cd /path/to/your/special/place;/bin/your-special-command ARGS)

在子 shell 中使用 cd; 使用这种子 shell 的简便方法是使用括号。

(cd wherever; mycommand ...)

也就是说,如果你的命令有一个它需要的环境,它应该确保环境本身,而不是把责任推给任何可能想要使用它的东西(除非它是一个内部命令,在一个定义良好的大系统的上下文中,在非常特定的情况下使用,这样任何调用者已经需要确保它需要的环境)。通常这是某种 shell 脚本包装器。

你可以使用 cd内建函数,或者 pushdpopd内建函数来实现这个目的。例如:

# 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;
  1. 我们正在设置一个变量 current_dir等于你的 pwd
  2. 之后我们将转到 cd到你需要运行命令的地方
  3. 那我们就运行命令
  4. 然后我们将 cd返回到变量 current_dir

或者

pushd && cd /path/to/your/command/dir && special command ARGS && popd

感谢@apieceofbart 和@Konstantin

提供一点有用的信息:

这将把 shell 目录更改为 ~/project

function mymake() {
cd ~/project && make $1
}

不会的

function mymake() (
cd ~/project && make $1
)

逃跑

mymake something