compreende a ordem das operações para expansão do parâmetro bash

0

Eu li um exemplo semelhante do livro de programação bash:

$ cat indirection 
#!/usr/bin/env bash

set -x
num=1
eval "${!num#*:}"
$ 

Quando executo o script com bash indirection "test:echo blah" , como a última linha do script é processada? Eu acho que primeiro a indirecção acontece para que eval "${!num#*:}" se torne eval "${1#*:}" ? Em seguida, a remoção da substring ocorre e eval "${1#*:}" se torna eval echo blah ? Se sim, então por que eval é necessário, ou seja, ${!num#*:} em vez de eval "${!num#*:}" forneceria os mesmos resultados?

    
por Martin 06.07.2017 / 00:41

1 resposta

3

A saída da expansão do parâmetro é:

$ echo "${1#*:}"
echo blah

Bem, sim, neste caso específico:

$ set -- "test:echo blah"
$ eval "${1#*:}"
blah

$ ${1#*:}
blah

Execute o mesmo comando. Mas isso nem sempre é verdade:

$ "${1#*:}"
bash: echo blah: command not found

Na verdade, uma string que contenha caracteres meta do shell não funcionará corretamente, mesmo que não seja citada.

$ set -- "test:echo blah > file"
${1#*:}
blah > file

O redirecionamento não aconteceu, mas (cuidado com o fato de que um arquivo será criado):

$ eval "${1#*:}"

Criará um arquivo chamado arquivo no PWD.

    
por 06.07.2017 / 04:39

Tags