Вот другая техника вроде той, которую отправил Gilles:
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
который создает массив с 13 923 элементами (если это - то, сколько файлы там).
В первую очередь, как ddeimeke сказал, псевдонимы по умолчанию не расширены в неинтерактивных оболочках.
Во-вторых, .bashrc
не читается неинтерактивными оболочками, если Вы не устанавливаете BASH_ENV
переменная среды.
Но самое главное: не делайте этого!Пожалуйста? Однажды Вы переместите тот сценарий куда-нибудь, где необходимые псевдонимы не установлены, и он повредится снова.
Вместо этого набор и переменные условий применения как ярлыки в Вашем сценарии:
#!/bin/bash
CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh
for file in "$@"
do
$CMDA "$file"
$CMDB "$file"
done
При изучении страницы справочника удара, Вы находите:
Псевдонимы не расширены, когда оболочка не интерактивная, если опция оболочки expand_aliases не установлена с помощью shopt (см. описание shopt под SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже).
Так помещает a
shopt -s expand_aliases
в Вашем сценарии.
Удостоверьтесь, что получили свой файл псевдонимов после установки этого в Вашем сценарии.
shopt -s expand_aliases
source ~/.bash_aliases
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
shopt -s expand_aliases
не должен идти перед определением псевдонима, но перед использованием псевдонима. Добавление к @FrankSchubert: Интерактивное обнаружение оболочки может также быть сделано с помощью $-
который содержит опции для оболочки, конкретно i
если оболочка является интерактивной.
– valid
20.03.2015, 16:12
~/.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 говорится, "Почти для каждой цели, функции оболочки предпочтены по псевдонимам".
Я иногда находил, что сценарий удара не распознает экспорт также. Однако изменение его к
#!/bin/sh
работы для меня.
[cmd line] > bash -i [your script's file path]
i
предназначен для интерактивного использования и является источником вашего профиля bash
.
Вы также можете использовать .
перед скриптом. Запустите его как:
. /path/to/your/scrtip.sh
Вы можете проверить наличие этого условия в сценарии bash как
if [[ $- == *i* ]]
then
echo "running on interactive mode. aliases will work!"
fi
alias
варианты использования. Например.alias mv="mv -v --backup=numbered"
. – Evi1M4chine 23.04.2016, 23:11$CMDA
/$CMDB
… Кроме прописных переменных, зарезервированных для самого удара в ударе и этом действительно работа, то отсутствие кавычек делает меня действительно неудобным … Спасибо так или иначе. – Evi1M4chine 30.04.2016, 03:26gizmo
не находится на пути или существует команда с тем же именем, но более высоким приоритетом. еще Вы могли простой наборCMDA
к плоскостиgizmo
во-первых. – 05.04.2017, 12:20