У меня очень странный случай... Если я запускаю скрипт с /bin/bash, он не может распознать псевдонимы, которые я установил даже внутри скрипта. И самое странное, что
$ cat -n test.sh
1 #!/bin/bash
2 alias somecommand='ls -alF'
3 alias
4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found
... как показано выше, если я запускаю команду "alias" в скрипте, то оказывается, что bash занялsomecommandв псевдонимы, но если я запущуsomecommandсам он все равно не будет признан!
Все правильно, если я использую команду "sh" для запуска скрипта.. так это баг bash? Или я что-то упускаю?
Любая помощь приветствуется!
решение1
Просто не надоиспользоватьпсевдонимы в скриптах. Мало смысла использовать функцию, предназначенную для интерактивного использования в скриптах. Вместо этого используйте функции:
somecommand () {
ls -alF
}
Функции гораздо более гибкие, чем псевдонимы. Следующий пример перегрузит обычную ls
версию версией, которая всегда это делает ls -F
(аргументы передаются в , включая любые используемые вами флаги), почти так же, как это делал бы $@
псевдоним :alias ls="ls -F"
ls () {
command ls -F "$@"
}
Здесь command
предотвращается переход оболочки в бесконечную рекурсию, что в противном случае произошло бы, поскольку функция также вызывается ls
.
Псевдоним никогда не сможет сделать что-то подобное:
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
Это создает функцию select_edit
, которая принимает каталог в качестве аргумента и просит пользователя выбрать файл в этом каталоге. Выбранный файл будет открыт в редакторе для редактирования.
В bash
руководстве содержится заявление
Почти для всех целей псевдонимы заменяются функциями оболочки.
решение2
Чтобы использовать интерактивные функции, такие как псевдоним, в скрипте bash, вам нужно запустить его в интерактивной оболочке bash. Для этого измените первую строку, включив -i
. Таким образом, ваш новый файл скрипта станет
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
решение3
Что-то вроде дубликатапредыдущий вопросОднако ответы там довольно многословны. Короткий ответ заключается в том, что по оккультным причинам по умолчанию bash не смотрит на псевдонимы, определенные внутри скриптов. Вы должны явно указать ему делать это с помощью строки shopt -s expand_aliases
в верхней части указанного скрипта. Сделайте это, и тогда ваш скрипт найдетsomecommand.
решение4
Используйте shopt -sq expand_aliases
, например, этот код в кодировке UTF-8:
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить