有没有一种方法可以在不同的目录中执行命令而不必cd
执行它?我知道我可以简单地cd
进出cd
,但我只是对放弃额外步骤的可能性感兴趣:)
答案1
我不知道这是否重要,但你可以创建一个子shell:
$ (cd /var/log && cp -- *.log ~/Desktop)
cd -
该目录仅针对该子 shell 进行更改,因此您可以避免事后需要进行的工作。
答案2
不是为了破坏别人给出的答案的价值,而是我相信你想要的这是:
(cd /path/to && ./executable [ARGS])
cd
请注意要在子 shell 中调用的括号。
答案3
有些程序有一些选项,您可以告诉它们目录(2)他们自己(例如GNU柏油的-C
/ --directory
)。
不过,除了这些计划之外,还必须采取一些措施目录。您可以编写和使用某种已编译的“二进制”程序,而不是让 shell 执行此操作,但它可能不会产生太多好处。
在另一个答案的评论中,您举了一个例子:
execindirectory -d /var/log "cp *.log ~/Desktop"
由于*.log
模式是由外壳本身扩展的(不是CP),有些东西必须目录在让 shell 评估您的命令之前先到该目录。
如果您只是想避免“cd back”,那么您可以使用子 shell 来隔离光盘来自您的工作 shell 实例。
(cd /path/to/dir && some command)
您可以将其打包在 shell 函数中。 (我-d
从示例用法中删除了该选项,因为如果目录实际上是可选的,则此命令没有什么意义。)
runindir() { (cd -- "$1" && shift && eval " $@"); }
runindir /var/log 'cp -- *.log ~/Desktop' # your example
runindir /var/log cp -- \*.log \~/Desktop # eval takes multiple args
# which it concatenates
# with spaces prior to
# evaluation
runindir /var/log cp -- \*.log ~/Desktop# 是不是可以先扩展波形符 # 扩展后的结果是 # 解释为 shell 代码并且 # 如果你的 $HOME 包含的话就会中断 # shell 特有的字符。
答案4
这里有一些东西应该让你cd
回到原来的位置(使用 Bash),因为不要忘记这样做似乎是问题的目的:
# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir
run-your-command
# Get back where you were at the beginning.
popd
(编辑:稍微缩短的版本,感谢@Random832)