Невозможно использовать псевдоним в скрипте, даже если я определяю его чуть выше!

Невозможно использовать псевдоним в скрипте, даже если я определяю его чуть выше!

У меня очень странный случай... Если я запускаю скрипт с /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'

запретить

Связанный контент