别名的标准用法是为扩展命令编写快捷方式,例如:alias ls='ls --color'
。
我想知道是否可以在左侧使用“参数”,以便它可以反过来工作。使用上面的示例,我很有兴趣知道alias ls --color='ls'
是否可行,也就是说,当某人键入ls --color
时,就会运行简单的ls
。
忘记这是否有用或有意义,我只是想知道它是否可行,或者是否有任何解决方法来实现相同的目标。
答案 0 :(得分:3)
现有的答案没有正确处理带空格的命令 - 实际上不能:将数组压缩成字符串本质上是错误的。
此版本使用参数列表作为数组,从而避免了这种信息丢失:
ls() {
local -a args=( )
for arg; do
[[ $arg = --color ]] || args+=( "$arg" )
done
command ls "${args[@]}"
}
或者,如果您的真正目标是为子命令设置别名(并且您可能希望将来处理更多子命令),请考虑case
结构,如下所示:
ls() {
local subcommand
if (( "$#" == 0 )); then command ls; return; fi
subcommand=$1; shift
case $subcommand in
--color) command ls "$@" ;;
*) command ls "$subcommand" "$@" ;;
esac
}
一些测试,以区分这个答案与先前存在的答案之间的正确性:
tempdir=/tmp/ls-alias-test
mkdir -p "$dir"/'hello world' "$dir"/my--color--test
# with the alternate answer, this fails because it tries to run:
# ls /tmp/ls-alias-test/hello world
# (without the quotes preserved)
ls --color "$dir/hello world"
# with the alternate answer, this fails because it tries to run:
# ls /tmp/ls-alias-test/my--test
ls --color "$dir/my--color--test"
答案 1 :(得分:0)
unalias ls后使用函数:
unalias ls
ls () { p=$@; p=${p//--color/}; /bin/ls $p ;}