Diferença entre os comandos eval e alias

0

quais são as diferenças entre os comandos eval e alias ?

Exemplos:

x=‘ls -d -l $HOME’
$x
eval $x

alias y=‘ls -l -d $HOME’
y
    
por MUE 13.04.2013 / 22:52

2 respostas

1

Principalmente semântica. Embora combinar as strings de comando em variáveis seja útil para fins de script, não é bom para o aliasing. Um motivo visível é a conclusão - enquanto vários scripts de conclusão, como bash_completion , podem lidar com aliases (o que infelizmente nunca foi meu caso), fazendo com que eles suponham que variáveis são extensíveis a comandos podem torná-lo confuso.

O segundo motivo é alias permitir que você crie atalhos de comando sem usar nenhum comando mágico nem caractere como $ para executá-los. Desta forma, a substituição é transparente e permite substituir as configurações padrão para alguns programas. Um bom exemplo é ls , que geralmente é alias como ls --color=auto por padrão. Os usuários não precisam saber disso para ver a saída colorida. Algumas distribuições alias rm e comandos relacionados como rm -i , para que funcionem no modo interativo e possam evitar remoções acidentais.

Variáveis, por outro lado, podem ser úteis para alguns usos que não requerem imitação de binários. Um exemplo amplo e bom é EDITOR variável ambiental. Isso torna possível não apenas executar seu editor favorito usando $EDITOR , mas também fazer com que outros programas (que podem não ter acesso ao shell) possam executá-lo, tirando seu valor do ambiente de execução.

Pode haver algumas outras coisas das quais não conheço, mas o resultado é o mesmo: esses comandos devem ser usados como pretendem.

    
por 13.04.2013 / 23:41
0

Aliases não devem ser usados em scripts (desativados por padrão em shells não interativos. Você pode até combinar vários aliases (como várias strings para eval) .Mas aliases não oferecem o nível legal de indireção que você obtém da linha de comando sendo analisado duas vezes:

text1=foo; text2=bar; text3=fubar
for((i=1;i<4;i++)); do
  eval echo \$text${i}
done

Eu admito que isso poderia ser feito sem eval ( varname=text${i}; echo ${!varname} ). Mas ao construir comandos eu sempre usaria eval.

A linha de expansão do shell (M-C-e) funciona sem erros. : -)

    
por 14.04.2013 / 01:50

Tags