São as únicas opções para expansão do comando bash:
- sem aspas
$(..)cuja saída é sempre analisada com divisão de strings mudas, ou - citado
"$(..)"cuja saída é sempre passada junto como uma unidade?
Eu estou tentando replicar no bash uma função de shell de peixe que criei para uso no Mac OS. Minha função de peixe selection https://superuser.com/a/1165855 pega a seleção na janela frontal e gera os caminhos para uso na substituição de comandos ls -l (selection). Eu estava esperando para conseguir a mesma coisa em bash talvez como ls -l $(selection).
Eu pensei que era uma questão de citar e assim tentei passar caminhos delimitados por alimentação de linha para o bash printf "%q ". No entanto, descobri que não importa em qual citação coloquei a saída de substituição de comando, ela estava sendo dividida em espaço em branco.
Exemplo simplificado:
$ touch file\ a file\ b
$ ls $( echo "file\ a file\ b" ) # want expansion equiv to: ls 'file a' 'file b'
ls: a: No such file or directory
ls: b: No such file or directory
ls: file\: No such file or directory
ls: file\: No such file or directory
Não seria o fim do mundo se eu tivesse que usar a substituição de comandos citada como, ls -l "$(selection)"mas fazendo isso, a saída do comando nunca é dividida, deixa de observar a minha cuidadosa citação. A sintaxe antiga do backtick é diferente?
Engraçado, bash, você tem muitos recursos. Não tem ninguém para permitir cmda $(cmdb-that-generates-parameters-for-cmda)? Ou um usuário bash simplesmente evita espaços ou símbolos em nomes de arquivos (como um animal) para tornar tudo mais fácil? Obrigado por qualquer resposta.