Bash如何在其他目录上下文中执行命令?


94

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

现在,我还有一个自定义的shell脚本,该脚本在一个目录中执行某些操作,但是我需要像在另一个目录中一样调用上述命令。

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


Answers:


39

您可以使用cd内建函数,也可以使用pushdpopd内建函数。例如:

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

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

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


4
cd -POSIX Shell中也有一个可更改回先前的目录。这就是说,(一)pushdpopd被真正用于交互使用,及(b)它并不总是安全的假设,你可以cd回到开始的地方,尤其是在复杂的子系统,它可以在内部使用权限限制(见stackoverflow.com/questions/ 10555284 /…)。
geekosaur,2012年

3
使用subshel​​l是更好的解决方案
josh123a123 '16

对于脚本编写,使用subshel​​l可能是一个更好的主意。但是,我真的很高兴学习popd
connorbode

您能否:在这里解释符号的含义?
瓦迪姆·科托夫

2
@VadimKotov我认为这实际上是一项禁忌行动。相关阅读部分man bash: [arguments]无效;无效。该命令除了扩展参数和执行任何指定的重定向外,什么也不做。返回状态为零。
boycy

218

cd在子外壳中使用;使用这种子shell的简写方式是括号。

(cd wherever; mycommand ...)

就是说,如果您的命令具有所需的环境,则应真正确保该环境本身,而不是将责任放在任何可能要使用的环境上(除非它是在井的情况下在非常特定的情况下使用的内部命令)定义更大的系统,这样任何调用者都已经需要确保所需的环境)。通常,这将是某种外壳脚本包装器。


您也可以在同一上下文中为多行命令的\每个;命令插入一个。
Chiramisu

36
(cd /path/to/your/special/place;/bin/your-special-command ARGS)

20

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

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


4
或者您可以做pushd && YOUR COMMAND && pulld
apieceofbart

4
@apieceofbart我想你的意思popd不是pulld
康斯坦丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.