Можно ли использовать псевдонимы в Zsh?

Чтение Какая разница между встроенной оболочкой и ключевым словом оболочки? Я задавался вопросом, сколько я мог псевдоним вещи в оболочке.

Так, например, вместо того, чтобы писать

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 с остальным приведенным выше кодом будет работать, однако. Я думаю, это все из-за того, что соответствующий код анализируется / подставляется на другом уровне конвейера интерпретатора.

Но есть ли способ сделать весь код выше, как ожидалось?

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' ]] … и флаги для конкретной команды. Последнее особенно интересно, поскольку его расширение может быстро перерасти в ограничение повторного использования общего словаря, относящегося к разному. флаги в зависимости от команды.

Другие вопросы по тегам