it-swarm-ru.tech

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

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

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

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


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

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

Что я делаю неправильно?

237
Zaid

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

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

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

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

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Если вы заглянете на страницу руководства bash, то найдете:

Псевдонимы не раскрываются, когда командная консоль не является интерактивной, кроме случаев, когда параметр Shell в расширенном режиме устанавливается с помощью shopt (см. Описание shopt в разделе "Команды сборки BULLTIN" ниже).

Так положить

shopt -s expand_aliases

в вашем сценарии.

Убедитесь, что вы установили файл псевдонимов после установки этого в вашем скрипте.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

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

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

 foo () 
 {
 echo "Hello World!" 
} 
 export -f foo 

Как говорится в руководстве по Bash: "Практически для всех целей функции Shell предпочтительнее псевдонимов".

48
Paused until further notice.
[cmd line] > bash -i [your script's file path]

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

11
user65576