【问题标题】:Temporarily change current working directory in bash to run a command [duplicate]临时更改 bash 中的当前工作目录以运行命令 [重复]
【发布时间】:2012-05-10 01:28:47
【问题描述】:

我知道我可以使用cd 命令在 bash 中更改我的工作目录。

但是如果我执行这个命令:

cd SOME_PATH && run_some_command

然后工作目录将被永久更改。有没有办法像这样临时更改工作目录?

PWD=SOME_PATH run_some_command

【问题讨论】:

  • 为什么不保持简单cd SOME_PATH && run_some_command && cd -最后一个命令会带你回到最后一个 pwd 目录。
  • @Sahil 那么它不能并行运行

标签: bash shell terminal working-directory


【解决方案1】:

您可以通过将命令行括在一对括号中来在子shell中运行cd和可执行文件:

(cd SOME_PATH && exec_some_command)

演示:

$ pwd
/home/abhijit
$ (cd /tmp && pwd)  # directory changed in the subshell
/tmp 
$ pwd               # parent shell's pwd is still the same
/home/abhijit

【讨论】:

  • 这样就使使用exec 的意义失效了,你不觉得吗?
  • @tripleee:我猜 OP 的意思是执行任何可执行文件而不是 exec。
  • 不能在 shell 文件中工作
  • @BeC 使用function 而不是alias。迟到两年总比没有好。
  • 最佳答案。也适用于多行包装器和过早退出
【解决方案2】:

bash 有一个内置的

pushd SOME_PATH
run_stuff
...
...
popd 

【讨论】:

  • +1,pushd/popd 非常适合这个。只是不要忘记在退出之前弹出。
  • 如果 run_stuff 可能失败(并且脚本退出),不一定是一个好的解决方案。你会被困在 SOME_PATH 中。
  • @ron.rothmanℝℝ 你就不能像pushd PATH; (run_stuff); [[ "$?" != 0 ]] && popd; ...; popd
  • 就我而言,如果脚本执行失败,例如git pull,我想在git log的目录中调查。
  • 在测试时快速更新另一个项目下的目标的好方法。谢谢!
【解决方案3】:

这样的事情应该可以工作:

sh -c 'cd /tmp && exec pwd'

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多