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

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

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

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


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

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

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

5 Solutions collect form web for “Почему мой скрипт Bash не распознает псевдонимы?”

Прежде всего, как сказал 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 

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

  • Найти, где определяется команда bash или из нее?
  • Как перечислить существующий псевдоним для определенного пользователя Linux?
  • псевдонимы параметров
  • Установка временных псевдонимов bash при входе в папку
  • Bash: используйте псевдоним переменной
  • Новый псевдоним, недоступный после;
  • Как передать аргументы команде 'source'?
  • Разрешить все псевдонимы в командной строке zsh
  • как создать постоянный псевдоним из скрипта
  • Как заменить последовательность команд одной командой в Linux?
  • csh: Преобразование псевдонимов в команды, которые устанавливают эти
  • Interesting Posts

    Как установить переменную среды в командной строке и отобразить ее в командах?

    Печать строк с нечетными номерами, печать строк с четными номерами

    Как изменить карту сменных клавиш в tmux?

    SSH на сервер, начать сеанс экрана, изменить каталог?

    Является ли Gobolinux активным больше?

    Какие версии libacl Дарвина имеют ошибку acl_get_file?

    Как читать значение переменной, где имя переменной – значение другой переменной

    не может получить доступ к интерфейсу CUPS

    Где Mutt помещает удаленные сообщения, если чистка не выполняется?

    Существуют ли какие-либо терминалы linux, которые могут обрабатывать все комбинации клавиш?

    Как перенаправить вывод из приложения командной строки (интерпретатор howie AIML) в другое приложение командной строки (espeak)?

    Разрешение отклонено при получении файла md5sum с помощью сценария оболочки?

    ОШИБКА в стиле модерн на MacBook Pro с загрузкой Debian

    Почему Vim не может открыть текстовый файл размером 100 МБ, если у меня 16 ГБ оперативной памяти?

    обновление-grub против grub-install?

    Linux и Unix - лучшая ОС в мире.