Por que meu script Bash não reconhece aliases?

186

No meu arquivo ~/.bashrc , residem duas definições:

  1. commandA , que é um alias para um caminho mais longo
  2. commandB , que é um alias para um script de Bash

Eu quero processar o mesmo arquivo com esses dois comandos, então eu escrevi o seguinte script Bash:

#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

Mesmo depois de sair da minha sessão e fazer login novamente, o Bash me avisa com command not found erros para os dois comandos quando eu executo esse script.

O que estou fazendo de errado?

    
por Zaid 02.09.2010 / 11:38

5 respostas

104

Em primeiro lugar, como disse o ddeimeke, os alias por padrão não são expandidos em shells não interativos.

Segundo, .bashrc não é lido por shells não interativos, a menos que você defina a variável de ambiente BASH_ENV .

Mas o mais importante: não faça isso! Por favor? Um dia, você moverá esse script para algum lugar em que os aliases necessários não estejam definidos e ele será quebrado novamente.

Em vez disso, defina e use variáveis de ambiente como atalhos no seu script:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done
    
por 02.09.2010 / 14:37
128

Se você olhar na manpage bash você encontra:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).

Coloque um

shopt -s expand_aliases

no seu script.

Certifique-se de fornecer o arquivo de aliases depois de definir isso no script.

shopt -s expand_aliases
source ~/.bash_aliases
    
por 02.09.2010 / 12:20
40

Os aliases não podem ser exportados, portanto, não estão disponíveis em scripts de shell nos quais não estão definidos. Em outras palavras, se você defini-las em ~/.bashrc , elas não estarão disponíveis para your_script.sh (a menos que você escolha ~/.bashrc no script, o que eu não recomendaria, mas há maneiras de fazer isso corretamente).

No entanto, as funções podem ser exportadas e estarão disponíveis para scripts de shell que são executados em um ambiente no qual eles são definidos. Isso pode ser feito colocando isso no seu bashrc:

foo()
{
    echo "Hello World!"
}
export -f foo

Como diz o manual do Bash: "Para quase todos os efeitos, as funções do shell são preferidas aos aliases".

    
por 02.09.2010 / 22:38
9
[cmd line] > bash -i [your script's file path]

O i é interativo e fornece seu perfil bash para você.

    
por 18.04.2014 / 16:23
-4

Descobri que, às vezes, o script bash também não reconhece exportação. No entanto, alterá-lo para

#!/bin/sh

funciona para mim.

    
por 08.05.2013 / 10:29

Tags