如何为“两个”字

时间:2016-11-17 12:00:41

标签: bash

别名的标准用法是为扩展命令编写快捷方式,例如:alias ls='ls --color'

我想知道是否可以在左侧使用“参数”,以便它可以反过来工作。使用上面的示例,我很有兴趣知道alias ls --color='ls'是否可行,也就是说,当某人键入ls --color时,就会运行简单的ls

忘记这是否有用或有意义,我只是想知道它是否可行,或者是否有任何解决方法来实现相同的目标。

2 个答案:

答案 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 ;}