ti-enxame.com

Por que meu script Bash não reconhece aliases?

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

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

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


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

Mesmo depois de sair da minha sessão e voltar a entrar, Bash me pede com command not found erros para os dois comandos quando executo esse script.

O que estou fazendo errado?

237
Zaid

Primeiro, como disse o ddeimeke, os aliases 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 onde os aliases necessários não estejam definidos e ele será interrompido 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 "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Se você olhar para a página de manual do bash, encontrará:

Os aliases não são expandidos quando o Shell não é interativo, a menos que a opção expand_aliases Shell seja configurada usando shopt (consulte a descrição do shopt em Shell BUILTIN COMMANDS abaixo).

Então coloque um

shopt -s expand_aliases

no seu script.

Certifique-se de fornecer seu arquivo de aliases depois de configurá-lo em seu script.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Os aliases não podem ser exportados, portanto, não estão disponíveis nos scripts do Shell nos quais não estão definidos. Em outras palavras, se você os definir em ~/.bashrc eles não estão disponíveis para your_script.sh (a menos que você forneça ~/.bashrc no script, que eu não recomendaria, mas existem maneiras de fazer isso corretamente).

No entanto, as funções podem ser exportadas e estariam disponíveis para scripts do Shell executados em um ambiente no qual estão definidas. Isso pode ser feito colocando-o no seu bashrc:

 foo () 
 {
 eco "Olá, mundo!" 
} 
 exportar -f foo 

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

48
[cmd line] > bash -i [your script's file path]

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

11
user65576