como evitar a expansão de alias por 'eval' para um alias arbitrário e manter a proteção de loop infinito em uma função?

2

IMPORTANTE: não use eval! (eu aprendi isso mais tarde ..)

Em uma função, eval expande sleep para seu alias, então evito o loop infinito dessa maneira:

function FUNCexecEcho() { 
  echo "EXEC: $@";
  shopt -u expand_aliases
  eval "$@";
  shopt -s expand_aliases
};
alias sleep='FUNCexecEcho sleep ';
sleep 10

Mas todos os outros aliases vão parar de funcionar ...
Como evitar a expansão apenas para um alias arbitrário dentro desta função?

PS .: o loop infinito só acontece na segunda vez que você executa sleep 10

    
por Aquarius Power 26.01.2014 / 21:31

3 respostas

1

Usar eval está errado em primeiro lugar. O shell já avaliou o que você passa para FUNCexecEcho , avaliar uma segunda vez é errado e potencialmente perigoso. Em seu código, você também está descartando o status de saída do comando.

FUNCexecEcho() { 
  echo "EXEC: $@"
  "$@"
}

(não há problema com aliases, a menos que você defina um alias para "$@" ). Compare o comportamento em:

FUNCexecEcho echo 'this;rm -rf "$HOME"'

com as duas versões. Com o meu, dá:

$ FUNCexecEcho echo 'this;rm -rf "$HOME"'
EXEC: echo this;rm -rf "$HOME"
this;rm -rf "$HOME"

Eu sugiro que você não o execute com o seu se você não tiver backups; -)

    
por 27.01.2014 / 00:13
3

Use uma barra invertida antes do comando para o qual você não precisa de um alias.

Por exemplo: eu uso \ls quando não quero invocar a versão com alias de ls , que é ls -thor .

No caso de eval, você precisará de uma barra invertida dupla, por exemplo. eval \ls .

    
por 26.01.2014 / 21:34
2

Você também pode usar o comando command . Assim:

$ alias echo="command echo 'hi: '"
$ echo "blah"
hi:  blah

Mas posso ignorar o alias echo da seguinte forma:

$ command echo "blah"
blah

Observe que eu usei command na minha definição alias também. Isso evita que o alias entre em loop em si mesmo.

    
por 26.01.2014 / 22:03