在给定目录中执行特定命令而不使用 cd'ing 到该目录?

在给定目录中执行特定命令而不使用 cd'ing 到该目录?

有没有一种方法可以在不同的目录中执行命令而不必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)

相关内容