В моем файле псевдонимов я уже определил:
alias e='eza --long --recurse --dereference …'
Я хочу добавить вариант, который добавляет еще один вариант в конце:
alias et='eza --long --recurse --dereference … --tree'
Вместо повторения кода я хотел бы повторно использовать значение e
, я попробовал:
alias et = "$(alias e) --tree"
Это дает неверный результат, поскольку команда alias KEY
выводит результат в формате alias KEY=VALUE
, где ЗНАЧЕНИЕ заключено в кавычки. В документации этот формат называется многоразовым.
Мне нужно значение псевдонима без кавычек.
alias et = "$(alias-value-unquoted e) --tree"
# hypothetical ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Как мне это сделать?
Почему бы просто не alias et='e --tree'
?
В простом случае вы можете повторить псевдоним. Согласно руководству: The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time.
Итак, это работает:
user@host: alias f='echo foo'
user@host: f
foo
user@host: alias g='f bar'
user@host: g
foo bar
В более сложных случаях следует перейти к функциям. Например:
e() {
eza --long --recurse --dereference "$@"
}
et() {
e "$@" --tree
}
Обратите внимание, что функции почти всегда предпочтительнее псевдонимов, поскольку функции обычно легче писать (не требуются дополнительные кавычки или экранирование специальных символов) и они более гибки с поддержкой аргументов. В последней строке записи псевдонимов в руководстве даже говорится: For almost every purpose, shell functions are preferred over aliases.
Повторите псевдоним, чтобы создать новый псевдоним, это очень разумно.
Независимо от простоты и если вы не пишете сценарии оболочки для компьютеров 35-летней давности, функции — правильный вариант. Псевдонимы являются остатком ранней оболочки, не имевшей функций. Псевдонимы существуют для обратной совместимости со старыми устаревшими файлами /etc/profile
или .profile
, так же, как расширение подоболочки с обратной галочкой или арифметический синтаксис $[]
.
Попробуйте
alias et = "$(alias e | sed "s/^[^']*'//; s/'$//") --tree"