Answers:
要执行具有特定工作目录的命令,通常需要执行
( cd directory && utility )
括号内是cd ...
指其中的命令在子外壳中运行。更改子外壳程序中的工作目录可以使它不更改调用程序外壳程序的当前工作目录,即,在调用此命令后,您仍将位于启动时所在的目录中。
例:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
由于别名不能接受任何参数,因此不能将其转换为通用别名。
对于特定的目录和实用程序,可以执行
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
但对于一般情况,则必须使用shell函数:
cdrun () {
( cd "$1" && shift && command "$@" )
}
要么
cdrun () (
cd "$1" && shift && command "$@"
)
用括号括住花括号,使函数在其自身的子外壳中执行。
这将用作
$ cdrun "$HOME/somedir" ./script.sh
它将运行script.sh
位于目录中的脚本$HOME/somedir
($HOME/somedir
作为工作目录),或者
$ cdrun / ls -l
这将为您提供根目录的“长格式”目录列表。
shell函数使用其第一个参数,并尝试更改到该目录。如果可行,它将目录名称从位置参数(命令行参数列表)中移开,并执行其余参数给出的命令。command
是外壳程序中的内置命令,仅将其参数作为命令执行。
如果要使用更改的工作目录执行命令,则需要所有这些。如果您只想执行其他位置的命令,显然可以使用
alias thing='$HOME/somedir/script.sh'
但是这将运行script.sh
位于$HOME/somedir
与当前目录作为工作目录。
在不更改工作目录的情况下执行位于其他位置的脚本的另一种方法是将脚本的位置添加到PATH
环境变量中,例如
PATH="$PATH:$HOME/somedir"
现在script.sh
,$HOME/somedir
只需使用即可在任何地方运行
$ script.sh
而且,这并不会改变该命令的工作目录。
{ ... }
较长功能的一致性。
pushd
和popd
(也> /dev/null
可以避免输出消息的同时)的一种改进,同时还使上下文保持了干净!
(cd dir && thing)
它比使用pushd
和更可移植popd
。
我使用此功能在不同目录中运行单个命令:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
此功能的局限性在于通配符是相对于原始目录而不是相对于命令运行的目录而言完成的。在zsh中可以做得更好。
cd
如果使用单个参数调用,则此函数的行为类似于普通函数,因此您可能需要调用它cd
。(此功能不支持任何选项,但cd
很少使用to 。)
cdrun () ( cd "$1" && shift && command "$@" )
。