118

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

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

您如何在 shell 脚本中执行此操作?

4

5 回答 5

269

在子shell中使用cd;使用这种 subshel​​l 的简写方式是括号。

(cd wherever; mycommand ...)

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

于 2012-05-12T19:04:37.153 回答
41
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
于 2012-05-12T19:04:28.950 回答
41

为此,您可以使用cd内置函数或内置pushd函数。popd例如:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

您可以像使用任何其他命令一样使用内置命令,并且可以在脚本中多次更改目录上下文。

于 2012-05-12T19:05:40.507 回答
23

如果要返回当前工作目录:

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

@apieceofbart 的另一个解决方案 pushd && YOUR COMMAND && popd

于 2014-11-06T18:42:47.570 回答
0

只是一个有用的信息:

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

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

这不会

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

跑步

mymake something
于 2021-09-30T16:20:01.197 回答