No meu ~/.bashrc
_ residem duas definições:
commandA
, que é um alias para um caminho mais longocommandB
, que é um alias para um script BashQuero 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?
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
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
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".
[cmd line] > bash -i [your script's file path]
O i
é interativo e origina seu perfil bash
para você.