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 -
事后需要进行的工作。
ale*_*lex 16
不要破坏其他人给出的答案的价值,但我相信你想要的是:
(cd /path/to && ./executable [ARGS])
Run Code Online (Sandbox Code Playgroud)
注意要cd
在子 shell 中调用的括号。
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)
小智 10
env
GNU 的程序coreutils-8.28
--chdir
(2017-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)
这里有一些东西应该让你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)