在给定目录中执行特定命令而无需 cd 到它?

Naf*_*Kay 55 linux bash cd-command

有没有办法在不同的目录中执行命令而不必cd执行它?我知道,我可以简单地cd在和cd了,但我只是感兴趣免收额外步骤的可能性:)

Mic*_*zek 70

我不知道这是否重要,但您可以创建一个子shell:

$ (cd /var/log && cp -- *.log ~/Desktop)
Run Code Online (Sandbox Code Playgroud)

该目录仅为该子shell 更改,因此您可以避免cd -事后需要进行的工作。

  • 为避免潜在的混乱,请用两个与号去掉分号:`$ (cd /var/log && cp *.log ~/Desktop)`。这样,如果目录不存在,则不会执行进一步的命令。 (8认同)
  • 对于像我这样天真的人请注意:开始时的 $ 不是命令的一部分,只是它之后的所有内容。 (6认同)
  • 这就是我通常所做的。 (2认同)

ale*_*lex 16

不要破坏其他人给出的答案的价值,但我相信你想要的是:

(cd /path/to && ./executable [ARGS])
Run Code Online (Sandbox Code Playgroud)

注意要cd在子 shell 中调用的括号。

  • 哦,我完全忘记将其包装到子外壳中。纠正我的答案,谢谢。 (2认同)

Chr*_*sen 15

有些程序有选项,你可以告诉它们自己chdir(2)(例如 GNU tar-C/ --directory)。

但是,在此类程序之外,必须对chdir 进行某些操作。您可以编写和使用某种编译过的“二进制”程序,而不是让 shell 来做,但这可能不会产生太大的好处。

在另一个答案的评论中,您举了一个例子:

execindirectory -d /var/log "cp *.log ~/Desktop"
Run Code Online (Sandbox Code Playgroud)

由于*.log模式是由 shell 本身(不是cp)扩展的,因此在让 shell 评估您的命令之前,必须将某些内容chdir到目录。

如果您只是想避免“cd back”,那么您可以使用子shell 将cd的影响与您的工作shell 实例隔离开来。

(cd /path/to/dir && some command)
Run Code Online (Sandbox Code Playgroud)

您可以将其打包到 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

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,除了我个人使用 pushd/popd (2认同)

小智 10

envGNU 的程序coreutils-8.28--chdir2017-09-01 发布)及更新版本具有

env: 添加 --chdir 选项

当与在不同上下文中运行命令的其他命令链接时,这非常有用,同时避免使用 shell 进行 cd,从而必须考虑 shell 引用链接的命令。

$ env --help | grep chdir
  -C, --chdir=DIR      change working directory to DIR
Run Code Online (Sandbox Code Playgroud)

因此,在现代系统(RHEL 8+、Ubuntu LTS 20.04+)上,您可以:

env --chdir=/tmp pwd
Run Code Online (Sandbox Code Playgroud)

如果您需要使用sudo并且不想搞乱引用参数,这尤其有用。

FILENAME="Some file maybe with spaces.txt"
FILEDIR="/some/directory maybe with spaces"
sudo env --chdir "$FILEDIR" \
  zip "/tmp/$FILENAME.zip" "$FILENAME"
Run Code Online (Sandbox Code Playgroud)


Bru*_*uno 6

这里有一些东西应该让你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
Run Code Online (Sandbox Code Playgroud)

(编辑:稍微短一点的版本,感谢@Random832)