Eu tenho um caso muito estranho ... Se eu executar um script com/bin/bash, ele não reconhecerá os aliases que defini 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, acontece que o bash tomoualgum comandonos aliases, mas se eu executar oalgum comandoem si ainda não será reconhecido!
Está tudo certo se eu usar o comando "sh" para executar o script.. então é um bug do bash? Ou há algo que estou perdendo?
Qualquer ajuda é apreciada!
Responder1
Simplesmente nãousaraliases em scripts. Não faz muito 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 que os aliases. O seguinte sobrecarregaria o normal ls
com uma versão que sempre o faz ls -F
(os argumentos são passados $@
, incluindo quaisquer sinalizadores que você usa), da mesma forma que o alias alias ls="ls -F"
faria:
ls () {
command ls -F "$@"
}
O command
here evita que o shell entre em uma recursão infinita, o que aconteceria de outra forma, já que a função também é chamada ls
.
Um alias nunca seria capaz de fazer algo assim:
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
Isso cria a função select_edit
que usa o diretório como argumento e pede ao usuário para escolher um arquivo nesse diretório. O arquivo escolhido será aberto em um editor para edição.
O bash
manual contém a declaração
Para quase todos os propósitos, os aliases são substituídos pelas funções shell.
Responder2
Para usar recursos interativos como alias em um script bash, você deve executá-lo em um shell bash interativo. Para isso altere a primeira linha para incluir um arquivo -i
. Então seu novo arquivo de script se torna
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
Responder3
Uma espécie de duplicata deuma pergunta anteriorno entanto, as respostas são meio prolixas. A resposta curta é que, por razões ocultas, por padrão o bash não olha para aliases definidos dentro de scripts. Você deve informar explicitamente para fazer isso por meio de uma shopt -s expand_aliases
linha na parte superior do script. Faça isso e então seu script encontraráalgum comando.
Responder4
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'
запретить