В моем .profile
(получен в sh
режиме эмуляции от моего .zshrc
) у меня есть следующий фрагмент:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
Однако второй псевдоним всегда переопределяет первый:
% type pacman
pacman is an alias for pacman --color auto
Как я могу сделать так, чтобы второе назначение псевдонима «наследовало» первое назначение, чтобы, если /usr/bin/pacmatic
существует, псевдоним стал pacmatic --color auto
?
Я не против использования функций вместо псевдонимов, но я бы предпочел, чтобы логика не выполнялась при каждом pacman
вызове (я хочу pacmatic
проверить один раз, при запуске оболочки, а не при каждом pacman
запуске). Я также предпочел бы sh
-портативный скрипт, но если это невозможно, вы можете использовать полный zsh
синтаксис.
(Да, я знаю , что это может быть легко решена путем добавления --color auto
к pacmatic
псевдониму. Но я хочу сделать это правильный путь ™) .
Я пробовал гуглить и просматривать страницы, но безрезультатно.
bash
), и они могут легко вызывать друг друга.Ответы:
Оболочка
alias
ведет себя очень похоже на a#define
, то есть переопределение псевдонима оболочки переопределит предыдущий.Я не уверен, что будет Right Way TM , но один из подходов - использовать функцию оболочки, которая принимает параметры, и использовать ее для создания псевдонима. Ваш фрагмент кода может быть переписан как:
Более того, даже если вы используете разные псевдонимы и пытаетесь использовать один для определения другого, он не будет работать, поскольку псевдонимы не раскрываются в неинтерактивном режиме по умолчанию. Вам нужно включить его, установив
expand_aliases
:Цитирование из руководства:
источник
type pacman
возвращаетpacman is an alias for pacman --color auto
как вsh
режиме эмуляции, так и в собственномzsh
режиме. однако, похоже, что редактирование, которое вы только что сделали, это то, что мне нужно.setopt aliases
.zsh
. И оболочка в любом случае выглядит интерактивной.Подстановка псевдонимов выполняется только при чтении строк из интерактивных источников. Таким образом, второй псевдоним не зависит от первого, отсюда и буквальная замена.
Возможно, что-то похожее:
Это установит 'pacman' на правильное значение, переменная env PACMAN не будет экспортирована, поэтому она исчезнет, когда скрипт завершится, а использование двойных кавычек обеспечит замену переменной при объявлении псевдонима, не для каждого вызова.
Я использую аналогичный метод:
В основном, установите env var PACMAN, проверьте pacmatic в пути, если он найден, установите PACMAN, затем определите псевдоним.
Хм, вы могли бы оптимизировать немного больше ...
Таа Даа! Установите в «pacman», если PACMAN не установлен, или в ноль, в противном случае установите значение «PACMAN», установите «pacmatic» в строке «which».
источник
bash
не расширяются псевдонимы в неинтерактивном режиме, но как это так же, как "интерактивные источники"?В zsh вы можете легко добавить псевдоним, используя
aliases
ассоциативный массив:В других оболочках вам нужно использовать выходные данные
alias
команды, чтобы узнать о существующих псевдонимах.Хотя я предлагаю это как возможность, я бы использовал переменную, как уже предлагалось другими ответами. Это понятнее, и вы можете различать значение переменной, если хотите настроить некоторые вещи по-разному в зависимости от того, какая из них используется
pacmatic
илиpacman
используется.источник
Короткая версия для второго псевдонима будет выглядеть так:
источник
Псевдонимы для птиц.
источник