在bash中临时更改当前工作目录以运行命令

261
我知道可以使用cd命令在Bash中更改工作目录。但如果我运行以下命令:
cd SOME_PATH && run_some_command

那么工作目录将会永久更改。有没有一种临时更改工作目录的方法,就像这样?

PWD=SOME_PATH run_some_command

2
为什么不保持简单,使用 cd SOME_PATH && run_some_command && cd - 命令,最后一个命令将带您回到上一个 pwd 目录。 - Sahil
@Sahil 那就不能并行运行。 - Eyal
3个回答

468

通过将命令行放在一对括号中,您可以在子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

1
在 shell 文件中无法工作。 - Allan Ruin
2
@BeC 使用function而不是alias。迟到两年总比永远不来好。 - jez
1
最佳答案。可以与多行封装一起使用,也支持早期退出。 - mjs
如果命令在子shell中运行,我将看不到其输出。 - Hexworks
值得注意的是:如果您的子shell运行命令(现在在括号中),并且该代码执行了“exit”(您想停止执行),则控制权将返回到父shell(父shell不会退出)。如果您重构代码,这可能是一个区别(如果括号中发生了错误,执行不会再停止)。 - Pierre
显示剩余4条评论

186

bash有一个内置的功能

pushd SOME_PATH
run_stuff
...
...
popd 

4
+1,pushd/popd 是完成这个任务的理想选择。只是在退出前不要忘记执行 popd。 - Fr0sT
31
如果run_stuff可能失败(并且脚本退出),那么这并不一定是一个好的解决方案。你会被困在SOME_PATH中。 - ron rothman
2
@ron.rothmanℝℝ,你能不能做这样的事情:pushd PATH; (run_stuff); [[ "$?" != 0 ]] && popd; ...; popd - galois
最适合我的答案! - Damian
这应该是被接受的答案!子shell会中断日志输出! - Hexworks
显示剩余2条评论

42

像这样应该可以工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接