Eu tenho um diretório com 3 arquivos: file1
, file2
e o seguinte script bash:
#!/bin/bash
set -e
Command="ls -1 -I file1"
echo "Command: $Command"
Files='$Command'
echo "Files:"
echo $Files
O resultado é o esperado. Ou seja file1
é ignorado e não é exibido na listagem:
$ ./test.sh
Command: ls -1 -I file1
Files:
file2
test.sh
Agora, e se eu quisesse suportar ignorar arquivos com um espaço no nome? Eu deveria colocar o nome do arquivo entre aspas, certo? Bem ...
#!/bin/bash
set -e
Command="ls -1 -I 'file1'"
echo "Command: $Command"
Files='$Command'
echo "Files:"
echo $Files
rendimentos:
$ ./test.sh
Command: ls -1 -I 'file1'
Files:
file1
file2
test.sh
No entanto, avaliar o mesmo comando diretamente no bash produz corretamente:
$ ls -1 -I 'file1'
file2
test.sh
O que está acontecendo aqui? Adicionar citações parece jogar fora algo errado, mas por quê?
Não ajuda substituir o comando com nada do tipo:
Command="ls -1 -I \"file1\""
Command="ls -1 --ignore='file1'"
Nem ajuda a mudar a avaliação do comando:
Files=$($Command)
Files=$('echo $Command')
Parece que o comportamento correto só pode ser recuperado com a introdução de um eval
Files=$(eval $Command)
Files='eval $Command'
Estou muito curioso para entender por que ls
é avaliado e executado, mas de alguma forma os argumentos citados para ele são ignorados, a menos que eval
seja adicionado.