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

4

Eu tenho um caso muito estranho ... Se eu executar um script com / bin / bash, ele não poderá reconhecer os aliases que eu configurei 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, o bash tomou somecommand nos aliases, mas se eu executar o somecommand ele ainda não será reconhecido!

Tudo está certo se eu usar o comando "sh" para executar o script ... então, é um bug do bash? Ou há algo que me falta?

Qualquer ajuda é apreciada!

    
por nichen 31.05.2017 / 08:50

5 respostas

8

Simplesmente não use aliases em scripts. Não faz 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 do que os aliases. O seguinte sobrecarregaria o usual ls com uma versão que sempre faz ls -F (argumentos são passados em $@ , incluindo qualquer sinalizador que você usa), praticamente como faria o alias alias ls="ls -F" :

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

O command aqui impede que o shell entre em uma recursão infinita, o que, de outra forma, faria, já que a função também é chamada ls .

Um alias nunca seria capaz de fazer algo assim:

select_edit () {
    if [ ! -d "$1" ]; then
        echo 'Not a directory' >&2
        return 1
    fi
    select file in $(find "$1" -maxdepth 1 -type f); do
        if [ -f "$file" ]; then
            ${EDITOR:-vi} "$file"
            break
        fi
        echo 'No such file' >&2
    done
}

Isso cria a função select_edit , que pega o diretório como um argumento e solicita ao usuário que escolha um arquivo nesse diretório. O arquivo escolhido será aberto em um editor para edição.

O manual bash contém a declaração

For almost every purpose, aliases are superseded by shell functions.

    
por 31.05.2017 / 09:26
6

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

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 
    
por 31.05.2017 / 08:58
3

Tipo de uma duplicata de uma pergunta anterior as respostas lá são meio verbosas. A resposta curta é que, por razões ocultas, por padrão, o bash não olha para aliases definidos dentro de scripts. Você precisa explicitamente dizer para fazer isso por meio de uma linha shopt -s expand_aliases no topo do script. Faça isso e, em seguida, seu script encontrará somecommand .

    
por 31.05.2017 / 09:13
1

Basta adicionar shopt -s expand_aliases após a primeira linha

#!/bin/bash
shopt -s expand_aliases
alias somecommand='ls -alF'
alias
somecommand

Isto irá produzir

$ /tmp/alias.sh 
alias somecommand='ls -alF'
total 111044
drwxr-xr-x  4 sobi3ch sobi3ch     4096 Aug 22 14:27 ./
drwxr-xr-x 31 sobi3ch sobi3ch     4096 Aug 23 10:19 ../

Aliases para padrão são apenas para shells interativos (de man bash )

expand_aliases

If set, aliases are expanded as described above under ALIASES. This option is enabled by default for interactive shells.

    
por 23.08.2018 / 10:25
0

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'

запретить
    
por 07.12.2018 / 19:01