В моем ~/.bashrc
файле находятся два определения:
commandA
, который является псевдонимом для более длинного путиcommandB
, который является псевдонимом Bash-скрипта
Я хочу обработать один и тот же файл этими двумя командами, поэтому я написал следующий скрипт Bash:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Даже после выхода из моего сеанса и повторного входа в систему Bash выдает сообщение об command not found
ошибке обеих команд при запуске этого сценария.
Что я делаю неправильно?
source ~/.bashrc
.Ответы:
Прежде всего, как сказал ddeimeke, псевдонимы по умолчанию не раскрываются в неинтерактивных оболочках.
Во-вторых,
.bashrc
не читается неинтерактивными оболочками, если не установленаBASH_ENV
переменная среды.Но самое главное: не делай этого! Пожалуйста? Однажды вы переместите этот сценарий куда-нибудь, где не установлены необходимые псевдонимы, и он снова сломается.
Вместо этого установите и используйте переменные среды как ярлыки в вашем скрипте:
источник
alias
случаев использования. Напримерalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
… Помимо переменных в верхнем регистре, которые зарезервированы для самого bash в bash, и это действительно работает, отсутствие кавычек делает меня действительно непростым… В любом случае, спасибо.gizmo
нет в пути или есть команда с тем же именем, но с более высоким приоритетом. иначе вы могли бы просто установитьCMDA
равнинуgizmo
в первую очередь.Если вы заглянете на страницу руководства bash, то найдете:
Так положить
в вашем сценарии.
Убедитесь, что вы установили файл псевдонимов после установки этого в вашем скрипте.
источник
shopt -s expand_aliases source ~/.bash_aliases
отлично работает для меня. Часто в .bashrc существует форма обнаружения интерактивной оболочки:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, возможно, вы хотите проверить это в файле, который вы выбрали.shopt -s expand_aliases
что не нужно идти перед определением псевдонима, но перед использованием псевдонима. Добавление к @FrankSchubert: Интерактивное обнаружение оболочки также может быть выполнено с использованием$-
опций, которые содержат параметры оболочки, особенноi
если оболочка является интерактивной.~/.bash_aliases
можете зависеть от других вещей, ранее загруженных в интерактивную оболочку ... Самое близкое, что я нашел, - это изменить свой hashbang на#!/bin/bash -li
Все еще не идеально. В идеале вы должны использовать функции, а не псевдонимы.Псевдонимы нельзя экспортировать, поэтому они недоступны в сценариях оболочки, в которых они не определены. Другими словами, если вы определите их в,
~/.bashrc
они недоступныyour_script.sh
(если вы не используете исходный текст~/.bashrc
в сценарии, что я бы не советовал, но есть способы сделать это правильно).Однако функции можно экспортировать, и они будут доступны для сценариев оболочки, которые запускаются из среды, в которой они определены. Это можно сделать, поместив это в ваш bashrc:
Как говорится в руководстве по Bash: «Практически для любых целей функции оболочки предпочтительнее псевдонимов».
источник
alias commandA=...
наcommandA() { ... }
затем,export commandA
и вы получите идентичное поведение с псевдонимом. Так что, насколько я знаю, это почти идентичная альтернатива псевдонимам, которая прекрасно работает в скриптах bashalias b=bash
позволяет легко сделать то,b -c "echo test | grep test"
что было бы трудно сделать в функциях.b () { bash "$@"; }
тогдаb -c "echo test | grep test"
Это
i
для интерактивных и источников вашегоbash
профиля для вас.источник
Иногда я обнаружил, что bash-скрипт тоже не распознает экспорт. Тем не менее, изменив его на
работает для меня.
источник