O texto produzido pelos backticks (ou a sintaxe alternativa $(…)
), como o texto resultante da substituição de uma variável ( $foo
), é expandido pelo shell: é dividido em palavras e as palavras são interpretadas como padrões glob (ou seja, \[?*
operam para corresponder aos arquivos). Para evitar esse problema, sempre use aspas duplas em torno das substituições de variáveis e comandos .
Há um segundo problema: analisar a saída de ls
é uma má ideia por vários motivos.
Se você usa zsh como seu shell, uma maneira fácil de fazer o que você está tentando é
cp ~/temp/*.xyz([1]) ./
Em outras shells, isso é mais difícil. Na linha de comando, você pode arriscar usar ls
, se souber que seu arquivo não contém nenhum caractere não imprimível (para a definição de% não imprimível de ls
). Em um script, isso está chamando para o desastre; um simples de duas linhas em ksh ou bash é
tmp=(~/temp/*.xyz)
cp -- "${a[0]}" ./
Em outros shells, você pode fazer desta forma (observe que isso sobrescreve os parâmetros posicionais):
set -- ~/temp/*.xyz
cp -- "$1" ./