【问题标题】:Can zsh buildtins be aliased?zsh buildtins可以别名吗?
【发布时间】:2017-12-27 22:38:40
【问题描述】:

阅读 What's the difference between shell builtin and shell keyword? 我想知道我可以在 shell 中给东西起多少别名。

例如,而不是写作

string_with_spaces='some spaces here'
if [ -n $string_with_spaces ]; then
    echo "The string is non-empty"
fi

挑战是写出类似

的东西
signvico='iuj spacetoj tie ĉi'

se ja nevakua $signvico plie vera ope nu tiam
    echo "la signvico ne estas vakua!"
eme

所以我尝试了这个

alias se='if'
alias tiam='then'
alias eme='fi'
alias ja='['
alias ope=']'
alias nevakua='-n'
alias vera='true'
alias plie='-a'
alias nu=';'
alias eĥu='echo'

但这行不通。事实上,使用-a-n;] 别名会使脚本失败。但是,将se ja -n $signvico -a vera ] ; tiam 与上述代码的其余部分一起使用将起作用。我想这都是由于在解释器管道的不同级别解析/替换了相应的代码。

但是有没有办法确实使上面的整个代码符合预期?

【问题讨论】:

    标签: zsh-alias


    【解决方案1】:

    答案是肯定的,在 zsh 中是可能的,只需使用 -g 标志。比如:

    # utilitarian commands/builtins
    alias eĥu='echo'
    alias surogu='sed'
    
    # control structure
    alias se='if'
    alias else='fi' # overriding `else` is not a problem it seems :)
    alias tiam='then'
    alias ja='['
    alias -g ope=']'
    
    # `test` flags
    alias -g plie='-a'
    alias -g nevakua='-n'
    
    # sed flags
    alias -g ige='-e'
    
    # statement combinators 
    alias -g nu=';'
    alias -g kaj='&&'
    alias -g aŭ='||'
    alias -g ke='|'
    
    signvico='iuj spacetoj spaces tie ĉi'
    
    se ja nevakua $signvico plie vera ope nu tiam
        eĥu "la signvico ne estas vakua!"
    else # literally "out of if"
    
    # echo 'word' | sed -e 's/word/vorto/'
    eĥu 'word' ke surogu ige 's/word/vorto/'
    

    Zsh 还包含一个-m 标志来匹配模式。这对于捕获 if [[ -n 'string' ]] … 中的 [[ 之类的结构和特定命令的标志可能很有用。后者特别有趣,因为扩展它可能会迅速增长到限制重复使用与 misc 有关的常用词汇。标志取决于命令。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 2011-06-11
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多