我正在尝试创建一个 bash 别名,它将充当前缀,并且可以在不需要使用空格的情况下进行解析。基本上,我有一组命令,它们都以相同的前几个字符开头,并且我想在运行之前为它们添加另一个命令的前缀,而不必每次都键入该前缀。
换句话说,我希望能够创建一个像这样工作的别名:alias pref="sudo commandtoprefix"
将使 runningprefcommand
能够运行sudo commandtoprefixcommand
。注意空间的不足,这一点很重要。
我认为我可以在某个时候通过简单地按照描述的操作来做到这一点,但由于某种原因它现在不起作用并返回错误command not found
。
我偶然发现这个答案,但它描述的是一个函数,因此需要使用空格,这并不完全符合我的需求。
有没有一种方法可以使用不需要使用空格的别名或函数来做到这一点?
答案1
您可以创建一个执行类似操作的函数。
function pref { prefix$*; }
随后又打电话pref command arg arg
,打电话prefixcommand arg arg
。
答案2
如果您确实坚持不使用空格,并且还坚持不提前确定以这种方式添加前缀的可能命令列表,那么我能想到的实现此目的的唯一方法是使用自定义“未找到命令”处理程序。
command_not_found_handle()
如果您输入不存在的命令,Bash 会调用该函数。您可以利用此功能让函数检查前四个字母是否为pref
,如果是,则检查后面的内容是否是实际命令的名称,如果是,则使用 sudo 运行它,否则仅报告常见错误。
command_not_found_handle() {
# read the "missing command" entered
missingcmd="$1"
# remove it from the argument list
shift
# check if starts with "pref"
if [[ "${missingcmd:0:4}" == "pref" ]] ; then
# read part after "pref"
prefixedcmd="${missingcmd:4}"
# check if it's a real command
if which "$prefixedcmd" &> /dev/null ; then
# run sudo with the cmd and the rest of the argument list
sudo "$prefixedcmd" "$@"
return $?
fi
fi
# default command not found behavior
echo "bash: $missingcmd: not found" >&2
return 127
}
把它放在你的.bashrc
.
编辑:我意识到我可能误解了你的问题;您想要执行此操作的命令可能已经有一个通用前缀,并且您希望在使用特殊的 sudo 添加前缀时将其省略。如果你只是改变我的路线,那也应该是可能的:
prefixedcmd="${missingcmd:4}"
到
prefixedcmd="commonprefix${missingcmd:4}"