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" ./