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

Вот другая техника вроде той, которую отправил Gilles:

word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)

который создает массив с 13 923 элементами (если это - то, сколько файлы там).

227
16.12.2017, 15:21
6 ответов

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

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

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

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

#!/bin/bash

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

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done
121
27.01.2020, 19:28
  • 1
    То решение не работает на обычное alias варианты использования. Например. alias mv="mv -v --backup=numbered". –  Evi1M4chine 23.04.2016, 23:11
  • 2
    @Evi1M4chine: Да, это делает. По крайней мере после того, как я вернулся Gilles ненужное редактирование. Но могло бы быть лучше использовать другую переменную для параметров, так или иначе. –   24.04.2016, 18:50
  • 3
    , отметьте отсутствие кавычек вокруг $CMDA / $CMDB… Кроме прописных переменных, зарезервированных для самого удара в ударе и этом действительно работа, то отсутствие кавычек делает меня действительно неудобным … Спасибо так или иначе. –  Evi1M4chine 30.04.2016, 03:26
  • 4
    @Evi1M4chine: Мм, что? 1. Я удалил кавычки сам в новом редактировании. 2. откуда Вы становитесь "сдержанными для самого удара"? это было бы первым, я услышал о нем. 3. Если это делает Вас обеспокоенными, что Вы думаете об использовании удара во-первых? Так или иначе используйте отдельную переменную для опций, как я сказал Вам. –   30.04.2016, 20:46
  • 5
    @alvas: предположение - это gizmo не находится на пути или существует команда с тем же именем, но более высоким приоритетом. еще Вы могли простой набор CMDA к плоскости gizmo во-первых. –   05.04.2017, 12:20

При изучении страницы справочника удара, Вы находите:

Псевдонимы не расширены, когда оболочка не интерактивная, если опция оболочки expand_aliases не установлена с помощью shopt (см. описание shopt под SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже).

Так помещает a

shopt -s expand_aliases

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

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

shopt -s expand_aliases
source ~/.bash_aliases
167
27.01.2020, 19:28
  • 1
    , я поместил его в свой сценарий, но это все еще не работает. Та же ошибка. –  Zaid 02.09.2010, 13:29
  • 2
    Добавление shopt -s expand_aliases source ~/.bash_aliases работы отлично для меня. Часто существует форма интерактивного обнаружения оболочки в .bashrc как это: # If not running interactively, don't do anything [ -z "$PS1" ] && return @Zaid, Возможно, Вы хотите проверить на это в файле, который Вы получили. –  Frank Schubert 04.04.2013, 04:46
  • 3
    ! сохраненный мои сценарии!! :) настолько трудно считать/искать/просмотреть информацию и страницы справочника в терминале, что я просто сдался давно, и пойдите поиск в Интернете... –  Aquarius Power 17.09.2013, 22:24
  • 4
    Любопытно, shopt -s expand_aliases не должен идти перед определением псевдонима, но перед использованием псевдонима. Добавление к @FrankSchubert: Интерактивное обнаружение оболочки может также быть сделано с помощью $- который содержит опции для оболочки, конкретно i если оболочка является интерактивной. –  valid 20.03.2015, 16:12
  • 5
    это не корректный ответ... Определение источника Ваших псевдонимов в Вашем сценарии не является ответом. Ваш ~/.bash_aliases мог бы зависеть от другого материала, ранее загруженного на интерактивной оболочке... Самая близкая вещь, которую я нашел, изменяет Ваш hashbang на #!/bin/bash -li Все еще прекрасный. Идеально необходимо использовать функции и не псевдонимы. –  Stefanos Kalantzis 05.02.2016, 13:47

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

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

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

Как в руководстве Bash говорится, "Почти для каждой цели, функции оболочки предпочтены по псевдонимам".

46
27.01.2020, 19:28

Я иногда находил, что сценарий удара не распознает экспорт также. Однако изменение его к

#!/bin/sh

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

-6
27.01.2020, 19:28
[cmd line] > bash -i [your script's file path]

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

16
29.04.2021, 01:01

Вы также можете использовать .перед скриптом. Запустите его как:

. /path/to/your/scrtip.sh

Вы можете проверить наличие этого условия в сценарии bash как

if [[ $- == *i* ]]
then
    echo "running on interactive mode. aliases will work!"
fi
4
20.08.2021, 13:40

Теги

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