我有一个.bash_profile
,其中我有一组别名。目前这些别名只执行一个命令,而且相当简单。然而,我想用我试图创建的新别名做两件事。
- CD 进入目录
- 从该目录运行命令
答案1
要使用特定工作目录执行命令,通常会这样做
( cd directory && utility )
两边的括号cd ...
表示其中的命令在子 shell 中运行。更改子 shell 中的工作目录使得调用 shell 的当前工作目录不会更改,即调用此命令后,您仍然位于启动时的同一目录中。
例子:
( 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 "$@"
)
将函数体周围的大括号替换为圆括号,使函数在其自己的子 shell 中执行。
这将用作
$ cdrun "$HOME/somedir" ./script.sh
script.sh
这将运行位于目录 中的脚本$HOME/somedir
,$HOME/somedir
作为工作目录,或者
$ cdrun / ls -l
这将为您提供根目录的“长格式”目录列表。
shell 函数采用其第一个参数并尝试更改到该目录。如果有效,它将目录名称从位置参数(命令行参数列表)移开,并执行其余参数给出的命令。command
是 shell 中的内置命令,它只是将其参数作为命令执行。
如果您想执行命令,则需要所有这些工作目录已更改。如果您只想执行位于其他地方的命令,显然可以使用
alias thing='$HOME/somedir/script.sh'
但这将运行script.sh
在$HOME/somedir
当前的目录作为工作目录。
在不更改工作目录的情况下执行位于其他位置的脚本的另一种方法是将脚本的位置添加到PATH
环境变量中,例如
PATH="$PATH:$HOME/somedir"
现在只需使用script.sh
即可$HOME/somedir
从任何地方运行
$ script.sh
再说一次,这确实不是更改命令的工作目录。
答案2
alias <name-of-the-alias>='cd <the-directory> && <command>'
因此,如果您想将目录(cd)更改为该文件夹/var/log/
,然后列出(ls)其文件,您可以在.bash_profile
文件中附加以下内容:
alias logs='cd /var/log/ && ls'
答案3
我使用此函数在不同的目录中运行单个命令:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
此函数的一个限制是通配符是相对于原始目录完成的,而不是相对于命令运行的目录完成的。zsh 可以做得更好。
如果使用单个参数调用,则该函数的行为与普通函数类似cd
,因此您可能需要调用它cd
。 (该函数不支持任何选项,但cd
很少使用选项。)
答案4
用分号分隔命令,例如:
alias do_something='cd /tmp; ls'