it-swarm.cn

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

有没有一种方法可以在另一个目录中执行命令而不必cd呢?我知道我可以简单地cd输入和cd输出,但是我只是对放弃这些额外步骤的可能性感兴趣:)

43
Naftuli Kay

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

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

仅针对该子shell更改目录,因此避免了需要cd -之后。

56
Michael Mrozek

某些程序具有一些选项,您可以通过它们选择 chdir(2) 自己(例如GNU tar-C/_--directory)。

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

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

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

由于Shell本身会扩展*.log模式(而不是cp),因此在Shell评估命令之前,必须进行chdir到目录。

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

(cd /path/to/dir && some command)

您可以将其打包在Shell函数中。 (我从您的示例用法中删除了-d选项,因为如果目录实际上是可选的,则对该命令没有多大意义。)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

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
14
Chris Johnsen

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

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

请注意在子Shell中调用cd的括号。

11
alex

这是应该让您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)

4
Bruno

可悲的是,您的示例:

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上使用。

2
user unknown

怎么样 ./your/path/command.sh

1
bdictator