I see that using
ls "'cmd'"
works. But, this does not work if I want to pass multiple files as argument to ls with some possibly containing spaces.
Está correto. É o mesmo problema com o armazenamento de comandos em uma variável (discutido por exemplo, aqui ), não pode ser feito agradável. As opções que vêm à mente são:
- Solicite que
cmd
emita uma lista de nomes de arquivos separados por NUL, em seguida canalize paraxargs -0
para passá-los para outro comando - Defina
IFS
para algum caractere que não apareça em nenhum nome de arquivo e tenhacmd
na saída da lista de arquivos separados por - Solicite
cmd
os nomes dos arquivos corretamente citados para o shell e, em seguida, execute-o emeval
.
Assim:
$ touch "with space" "another space"
$ printf "%s$ touch "with space" "another space"
$ printf "%s%pre%" "with space" "another space" | xargs -0 ls -i
1705749 another space 1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space 1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space 1705230 with space
" "with space" "another space" | xargs -0 ls -i
1705749 another space 1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space 1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space 1705230 with space
Ou use find -exec ...
se você pode substituir cmd
por isso.