Bash: use um alias em uma variável

9

Estou escrevendo um script bash que executa cada um de seus argumentos como um comando. Isso funciona para comandos no meu PATH, mas não para aliases. Posso chamar diretamente um alias no script, mas não posso chamar um alias que foi passado como argumento.

O problema (suponho) é que os aliases são expandidos antes das variáveis. Existe uma maneira de executar aliases de uma variável?

Exemplo de script:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"funciona, mas runall "myalias"runall: line 8: myalias: command not found

Jayson
fonte

Respostas:

9

Após alguns testes, concluí o seguinte:

  • Os aliases funcionam apenas no modo interativo (adicione -iao shebang).
  • Os aliases não são avaliados quando provêm de uma fonte interpretada (nesse caso, a variável
  • Você pode obter o bash para usar o alias com eval $1. Observe que evalqualquer coisa criada com uma variável é perigosa, mas como todo o ponto do script requer execução arbitrária, não farei muito isso.

Na página do manual do bash:

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

Então você pode adicionar em shopt -s expand_aliasesvez de -i.

Além disso,

Os aliases são expandidos quando um comando é lido, não quando é executado.

Como as variáveis ​​não são expandidas antes da leitura do comando, elas não serão expandidas ainda mais usando o alias.

Kevin
fonte
11
Bom saber. Apenas por curiosidade: por que é perigoso para evalvariáveis?
11
@hesse Considere eval "echo $1". Diga que eu ligo ./script.sh "hello;rm -rf ~. O que é executado? echo hello, seguido por rm -rf ~. Obviamente, esse é um exemplo artificial, mas o princípio é válido.
Kevin
adicionando evalna frente do $1trabalhado, já que eu já tinha shopt -s expand_aliases. Obrigado!
21412 Jayson
1

Eu tive um problema semelhante e consegui resolver meu problema transformando meus aliases em funções, conforme descrito neste site , que funcionou para mim.

por exemplo

alias lsd="ls -lash"

para

function lsd() { ls -lash; }
aydow
fonte