Почему мой скрипт 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 ошибки для обеих команд при запуске этого скрипта.

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

166 голосов | спросил Zaid 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 13:38:43 +0400 2010, 13:38:43

5 ответов


98

Прежде всего, как сказал 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
ответил 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 16:37:53 +0400 2010, 16:37:53
112

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

  

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

Итак, поставьте

shopt -s expand_aliases

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

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

shopt -s expand_aliases
source ~/.bash_aliases
ответил ddeimeke 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 14:20:27 +0400 2010, 14:20:27
36

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

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

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

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

ответил Dennis Williamson 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 03 Sep 2010 00:38:29 +0400 2010, 00:38:29
8
[cmd line] > bash -i [your script's file path]

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

ответил user65576 18 PMpFri, 18 Apr 2014 18:23:36 +040023Friday 2014, 18:23:36
-3

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

#!/bin/sh

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

ответил lwpro2 8 Maypm13 2013, 12:29:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132