Answers:
我不知道这是否很重要,但是您可以制作一个subshell:
$ (cd /var/log && cp -- *.log ~/Desktop)
仅针对该子Shell更改目录,因此避免了cd -
以后需要进行的工作。
$ (cd /var/log && cp *.log ~/Desktop)
。这样,如果目录不存在,则不会再执行其他命令。
某些程序具有一些选项,您可以使用这些选项自己告诉自己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
这是应该让您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)
pushd other-dir
,而不是pushd .; cd other-dir
可悲的是,您的示例:
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上使用。
怎么./your/path/command.sh
样
execindirectory -d /var/log "cp *.log ~/Desktop"
。
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
。如果您希望它实际支持选项“标签”(例如,诸如此类),则可能需要付出更多的努力-d
。