Não é possível usar alias no script, mesmo que eu o defina logo acima!

Não é possível usar alias no script, mesmo que eu o defina logo acima!

Eu tenho um caso muito estranho ... Se eu executar um script com/bin/bash, ele não reconhecerá os aliases que defini mesmo dentro do script. E o mais estranho é

$ 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

... como mostrado acima, se eu executar o comando "alias" no script, acontece que o bash tomoualgum comandonos aliases, mas se eu executar oalgum comandoem si ainda não será reconhecido!

Está tudo certo se eu usar o comando "sh" para executar o script.. então é um bug do bash? Ou há algo que estou perdendo?

Qualquer ajuda é apreciada!

Responder1

Simplesmente nãousaraliases em scripts. Não faz muito sentido usar um recurso projetado para uso interativo em scripts. Em vez disso, use funções:

somecommand () {
    ls -alF
}

As funções são muito mais flexíveis que os aliases. O seguinte sobrecarregaria o normal lscom uma versão que sempre o faz ls -F(os argumentos são passados $@, incluindo quaisquer sinalizadores que você usa), da mesma forma que o alias alias ls="ls -F"faria:

ls () {
    command ls -F "$@"
}

O commandhere evita que o shell entre em uma recursão infinita, o que aconteceria de outra forma, já que a função também é chamada ls.

Um alias nunca seria capaz de fazer algo assim:

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
)

Isso cria a função select_editque usa o diretório como argumento e pede ao usuário para escolher um arquivo nesse diretório. O arquivo escolhido será aberto em um editor para edição.

O bashmanual contém a declaração

Para quase todos os propósitos, os aliases são substituídos pelas funções shell.

Responder2

Para usar recursos interativos como alias em um script bash, você deve executá-lo em um shell bash interativo. Para isso altere a primeira linha para incluir um arquivo -i. Então seu novo arquivo de script se torna

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 

Responder3

Uma espécie de duplicata deuma pergunta anteriorno entanto, as respostas são meio prolixas. A resposta curta é que, por razões ocultas, por padrão o bash não olha para aliases definidos dentro de scripts. Você deve informar explicitamente para fazer isso por meio de uma shopt -s expand_aliaseslinha na parte superior do script. Faça isso e então seu script encontraráalgum comando.

Responder4

Use shopt -sq expand_aliases, por exemplo, este código na codificação 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'

запретить

informação relacionada