【问题标题】:How can Bash execute a command in a different directory context?Bash 如何在不同的目录上下文中执行命令?
【发布时间】:2012-05-20 22:42:01
【问题描述】:

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

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

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

【问题讨论】:

标签: bash shell working-directory


【解决方案1】:

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

(cd wherever; mycommand ...)

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

【讨论】:

  • 您还可以在每个; 之后插入一个\,用于同一上下文中的多行命令。
【解决方案2】:

您可以为此目的使用 cd 内置函数,或 pushdpopd 内置函数。例如:

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

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

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

【讨论】:

  • 在 POSIX shell 中还有 cd - 可以更改回上一个目录。也就是说,(a) pushdpopd 确实是为交互使用而设计的,并且 (b) 假设你可以 cd 回到你开始的地方并不总是安全的,尤其是可能在内部使用限制性权限的复杂子系统(请参阅stackoverflow.com/questions/10555284/…)。
  • 使用 subshel​​l 是一个更好的解决方案
  • 对于脚本,子shell 可能是一个更好的主意。但是我很高兴了解popd
  • 你能解释一下:符号在这里是什么意思吗?
  • @VadimKotov 我认为这实际上是一个无操作。 man bash 的相关部分为:: [arguments] 无效;该命令除了扩展参数和执行任何指定的重定向之外什么都不做。返回状态为零。
【解决方案3】:
(cd /path/to/your/special/place;/bin/your-special-command ARGS)

【讨论】:

    【解决方案4】:

    如果你想回到你当前的工作目录:

    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

    【讨论】:

    • 或者你可以做pushd && YOUR COMMAND && pulld
    • @apieceofbart 我想你的意思是popd而不是pulld
    【解决方案5】:

    只是一点有用的信息:

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

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

    这不会

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

    运行

    mymake something
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多