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

Mar*_*ace 68 bash shell working-directory

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

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

你如何在shell脚本中这样做?

gee*_*aur 171

cd在子壳中使用; 使用这种子shell的简写方法是括号.

(cd wherever; mycommand ...)
Run Code Online (Sandbox Code Playgroud)

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

  • 对于同一上下文中的多行命令,您还可以在每个“;”之后插入“\”。 (3认同)
  • 卧虎藏龙,隐藏最佳答案 (2认同)

bma*_*ies 28

(cd /path/to/your/special/place;/bin/your-special-command ARGS)
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 28

您可以使用cd内置的,或者pushdpopd建宏用于这一目的.例如:

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

# do something with /tmp as the working directory
cd /tmp
:
Run Code Online (Sandbox Code Playgroud)

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

  • 在 POSIX shell 中还有 `cd -` 可以改回上一个目录。也就是说,(a) `pushd` 和 `popd` 确实是为交互使用而设计的,并且 (b) 假设你可以 `cd` 回到你开始的地方并不总是安全的,*特别是*在可能使用的复杂子系统中内部限制性权限(参见 http://stackoverflow.com/questions/10555284/in-what-way-is-fast-abs-path-dangerous-but-potentially-faster)。 (4认同)
  • 使用子shell是一个更好的解决方案 (3认同)
  • @VadimKotov我认为这实际上是一种无操作.`man bash`的相关部分是:`:[参数]`没有效果; 除扩展参数和执行任何指定的重定向之外,该命令不执行任何操作.返回状态为零. (2认同)

abc*_*123 15

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

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
Run Code Online (Sandbox Code Playgroud)
  1. 我们设置一个current_dir等于你的变量pwd
  2. 之后我们将前往cd您需要运行命令的地方
  3. 然后我们正在运行命令
  4. 然后我们将cd回到我们的变量current_dir

请享用

  • 我相信最后一个命令应该是 `pushd /path/to/your/command/dir && 特殊命令 ARGS && popd` (4认同)
  • 或者你可以做`pushd &&你的COMMAND && pulld` (3认同)
  • @apieceofbart我认为您的意思是`popd`而不是`pulld`。 (2认同)

Enz*_*zoR 6

您还可以使用以下env命令来实现相同的目的,而无需额外的 shell:

env --chdir=/whatever/path -S whatever_command -some -option and any other arguments
Run Code Online (Sandbox Code Playgroud)

whatever_command使用所有相关选项和参数执行的命令或脚本在哪里。这一切都必须遵循命令-S的选项env

当前工作目录仅针对execvp()系统调用而更改,因此最终它将恢复为原始值。

envGNUcoreutils包的一部分,可以在此处找到其手册页的副本以获取更多详细信息。

例如,您env还可以使用它来操纵环境变量和仅针对特定执行的信号处理。

这不适用于 shell 别名和 shell 函数,因为env仅适用于程序。