No meu ~/.bashrc
arquivo residem duas definições:
commandA
, que é um alias para um caminho mais longocommandB
, 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 "$@"
do
commandA $file
commandB $file
done
Mesmo depois de sair da minha sessão e voltar a entrar, o Bash solicita command not found
erros nos dois comandos quando executo esse script.
O que estou fazendo errado?
source ~/.bashrc
.Respostas:
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 aBASH_ENV
variável de ambiente.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:
fonte
alias
casos de uso habituais . Por exemploalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
… Além de as variáveis maiúsculas serem reservadas para o bash em si, e de fato funcionar, essa falta de aspas me deixa muito desconfortável… Obrigado mesmo assim.gizmo
não está no caminho ou existe um comando com o mesmo nome, mas com uma prioridade mais alta. caso contrário, você pode simplesmente definirCMDA
a planíciegizmo
em primeiro lugar.Se você olhar para a página de manual do bash, encontrará:
Então coloque um
no seu script.
Certifique-se de fornecer o arquivo de aliases depois de configurá-lo no seu script.
fonte
shopt -s expand_aliases source ~/.bash_aliases
funciona perfeitamente para mim. Frequentemente, existe uma forma de detecção interativa de shell em .bashrc assim:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, talvez você queira verificar isso no arquivo que você originou.shopt -s expand_aliases
não precisa ir antes da definição do alias, mas antes do uso do alias. Adicionando ao @FrankSchubert: A detecção interativa do shell também pode ser feita usando o$-
que contém as opções para o shell, especificamentei
se o shell for interativo.~/.bash_aliases
pode depender de outras coisas carregadas anteriormente em um shell interativo ... A coisa mais próxima que encontrei foi alterar seu hashbang para#!/bin/bash -li
Ainda não perfeito. Idealmente, você deve usar funções e não aliases.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ê os definir, eles
~/.bashrc
não estarão disponíveisyour_script.sh
(a menos que você forneça~/.bashrc
no script, o 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 shell scripts que são executados em um ambiente no qual estão definidas. Isso pode ser feito colocando-o no seu bashrc:
Como o manual do Bash diz: "Para quase todos os fins, as funções do shell são preferidas aos aliases".
fonte
alias commandA=...
comcommandA() { ... }
, em seguida,export commandA
e você terá um comportamento idêntico ao alias. Portanto, esta é praticamente uma alternativa idêntica à aliases, tanto quanto eu sei que funciona muito bem em bash scriptsalias b=bash
facilita ob -c "echo test | grep test"
que seria difícil de executar em funções.b () { bash "$@"; }
thenb -c "echo test | grep test"
O
i
é para interativo e fornece seubash
perfil para você.fonte
Às vezes, o script bash também não reconhece a exportação. No entanto, alterá-lo para
funciona para mim.
fonte