Почему мой скрипт Bash не распознает псевдонимы?

В моем файле ~/.bashrc два определения:

  1. commandA , который является псевдонимом более длинного пути
  2. commandB , который является псевдонимом сценария Bash

Я хочу обработать один и тот же файл с этими двумя командами, поэтому я написал следующий сценарий Bash:


 #!/bin/bash for file in $@ do commandA $file commandB $file done 

Даже после выхода из моего сеанса и входа в систему, Bash приглашает меня с command not found ошибки для обеих команд при запуске этого скрипта.

Что я делаю не так?

Прежде всего, как сказал ddeimeke, псевдонимы по умолчанию не расширяются в неинтерактивных оболочках.

Во-вторых, .bashrc не читается неинтерактивными оболочками, если вы не установите переменную среды BASH_ENV .

Но самое главное: не делайте этого! Пожалуйста? Однажды вы переместите этот скрипт где-нибудь, где необходимые псевдонимы не будут установлены, и он снова сломается.

Вместо этого установите и используйте переменные среды как ярлыки в вашем скрипте:

 #!/bin/bash CMDA=/path/to/gizmo CMDB=/path/to/huzzah.sh for file in "$@" do $CMDA "$file" $CMDB "$file" done 

Если вы посмотрите на man-страницу bash, вы найдете:

Псевдонимы не расширяются, если оболочка не является интерактивной, если только опция shell_allases не установлена ​​с помощью shopt (см. Описание магазина в разделе SHELL BUILTIN COMMANDS ниже).

Поэтому поставьте

 shopt -s expand_aliases 

в вашем скрипте.

Обязательно отправьте свой файл псевдонимов после установки этого сценария.

 shopt -s expand_aliases source ~/.bash_aliases 

Псевдонимы нельзя экспортировать, поэтому они недоступны в сценариях оболочки, в которых они не определены. Другими словами, если вы определяете их в ~/.bashrc они недоступны для your_script.sh (если вы не используете source ~/.bashrc в скрипте, который я бы не рекомендовал, но есть способы сделать это правильно).

Однако функции могут быть экспортированы и будут доступны для сценариев оболочки, которые запускаются из среды, в которой они определены. Это можно сделать, разместив это в своем bashrc:

 Foo ()
 {
     эхо "Hello World!"
 }
 export -f foo

В руководстве Bash говорится: «Для почти всех целей функции оболочки предпочтительнее над псевдонимами».

 [cmd line] > bash -i [your script's file path] 

i для интерактивных и источников вашего профиля bash для вас.

Я обнаружил, что иногда скрипт bash не распознает экспорт. Однако, изменив его на

 #!/bin/sh 

работает на меня.