在给定目录中执行特定命令而不进行CD'ing?


42

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


这是相当琐碎,做一个脚本,做这样的:echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory。如果您希望它实际支持选项“标签”(例如,诸如此类),则可能需要付出更多的努力-d
LawrenceC

由于用户在回答中的状态未知,因此您在此处给出的所有示例以及在注释中给出的所有示例都可以通过其他解决方案更好地解决,因此尚不清楚是否确实存在需要在此处解决的问题。你能提出一个更好的例子吗?
卡莱布

Answers:


55

我不知道这是否很重要,但是您可以制作一个subshel​​l:

$ (cd /var/log && cp -- *.log ~/Desktop)

仅针对该子Shell更改目录,因此避免了cd -以后需要进行的工作。


2
那就是我通常所做的。
亚当·伯特

很好,我完全忘记了子壳,在这种情况下非常方便。
Naftuli Kay 2011年

4
为避免潜在的混乱,请用两个“&”号分隔分号:$ (cd /var/log && cp *.log ~/Desktop)。这样,如果目录不存在,则不会再执行其他命令。
Naftuli Kay 2013年

请注意像我这样幼稚的其他人:$开头不是命令的一部分,而是命令后面的所有内容。
Maltronic

14

某些程序具有一些选项,您可以使用这些选项自己告诉自己chdir(2)(例如,GNU tar-C/ --directory)。

但是,在此类程序之外,必须使用chdir。您可以编写和使用某种已编译的“二进制”程序来代替Shell来执行,但是这样做可能不会带来太大的好处。

在另一个答案的评论中,您给出了一个示例:

execindirectory -d /var/log "cp *.log ~/Desktop"

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

如果您只是想避免“ cd back”,那么可以使用子shell来将cd的效果与工作的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

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first

2
我喜欢这个解决方案,除了我个人会使用push / popd
NJ

10

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

(cd /path/to && ./executable [ARGS])

请注意要cd在子外壳中调用的括号。


我不这么认为。据我了解,他希望最终进入初始目录。
亚当·伯特

哦,我完全忘记将其包装到子外壳中。更正了我的答案,谢谢。
Alex

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)


1
您可能只是pushd other-dir,而不是pushd .; cd other-dir
Random832

@ Random832,好点!
布鲁诺

2

可悲的是,您的示例:

execindirectory -d /var/log "cp *.log ~/Desktop"

不需要更改目录,因为

cp /var/log/*.log ~/Desktop

会做同样的事情。您不能更接近实际问题吗?因为我们可能也知道更好的解决方案。

解决您的问题的一种复杂方法(与Michaels解决方案的优雅风格相去甚远)是find的用法,该方法在要查找文件的dir中执行开关“ -execdir”。不适合您的示例:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

也许对您的实际问题很有用。-okdir而不是-execdir将要求您确认每次调用。

-okdir和-execdir可能需要安装gnu-find,通常在Linux上使用。


1

怎么./your/path/command.sh


不,我其实是像下面这样:execindirectory -d /var/log "cp *.log ~/Desktop"
Naftuli Kay 2011年

我完全清楚这不是严格必要的,顺便说一句,我只是对它是否可以真正实现感兴趣。
Naftuli Kay 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.