【问题标题】:Make zsh aliases work with a prefixed command使 zsh 别名与前缀命令一起使用
【发布时间】:2017-11-09 17:01:36
【问题描述】:

一些命令以某种方式操纵环境,然后调用另一个命令。例如,xargs <command> <args> 通过标准输入获取参数并将它们附加到 args 列表的末尾,然后使用这些参数运行 <command>

另外,我可以在我的 zsh 配置中定义别名。例如,

alias ll='ls -al'

表示我可以在命令行输入ll,ZSH 会将其扩展为ls -al

但是,我不能将两者结合使用。如果我写 echo Documents | xargs ll 我会得到:

ll: command not found

有没有办法指示 ZSH 在有问题的命令之后扩展别名?例如。 “如果第一个命令是 xargs,则扩展您之后看到的任何其他内容。”

【问题讨论】:

    标签: zsh variable-expansion


    【解决方案1】:

    你可以定义一个全局别名:

    alias -g ll='ls -al'
    

    但是请注意,这会扩展 ll任何地方它被发现是一个不同的词,而不仅仅是像 xargs 这样的命令的命令参数。

    【讨论】:

      【解决方案2】:

      根据zsh manual

      检查 shell 输入中的每个符合条件的单词,以查看是否为其定义了别名。如果是这样,如果它在命令位置(如果它可能是简单命令的第一个单词),或者如果别名是全局的,则它被替换为别名的文本。 如果替换文本以空格结尾,则 shell 输入中的下一个单词始终符合别名扩展的条件。别名是使用 alias 内置定义的; 全局别名 可以使用该内置函数的 -g 选项来定义。

      全局别名不好,因为echo ll中的全局别名ll会被扩展。

      你的第一个选项是alias xargs='xargs ',多余的空格会导致xargs后面的单词扩大。

      但是还是有问题。比如mv经常被别名为nocorrect mv,所以xargs mv会抱怨nocorrect: No such file or directory

      我的解决方法是使用下面的sn-p来使其成为一个函数。

      function alias_unwrapper {
          local sudo="$1"
          if [[ ! -x "$sudo" ]]; then
             echo "$sudo not found"; return;
          fi
          local cmd=(${(s: :)aliases[$2]}); # let cmd be array of command and arguments
          (($#cmd)) || cmd=($2)             # if cmd has no aliases, use array of a single element
          while (( $#cmd > 0 )) && [[ $cmd[1] == "nocorrect" || $cmd[1] == "noglob" ]]; do
              shift cmd;         # remove beginning garbage
          done
          local args=(${cmd:1}); # origin params of alias
          args+=(${@:3})         # additional params after alias
          $sudo ${cmd[1]} $args        # unwrap the args array
      }
      
      
      function xargs {
          local XARGS=/usr/bin/xargs
          alias_unwrapper $XARGS $@
      }
      

      我自己使用上面的代码扩展sudowatchparallel

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-01
        • 2017-11-06
        • 2010-09-17
        • 2019-11-09
        • 2016-10-26
        • 1970-01-01
        • 2020-08-17
        • 2021-09-11
        相关资源
        最近更新 更多