argumento para cp em backticks não funciona?

1

Eu tentei usar um comando como

cp 'ls ~/temp/*.xyz | head -1' ./

Mas isso não funciona. Se eu ecoar o valor do comando dentro de tiques de volta e colocá-lo manualmente no comando cp ele funciona. Alguma idéia?

    
por Osada Lakmal 09.11.2010 / 18:34

2 respostas

1

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" ./
    
por 09.11.2010 / 19:49
0

Talvez o arquivo correspondente contenha caracteres especiais (por exemplo, espaços), portanto, é necessário citar a expressão de retrocessos:

cp "'ls ~/temp/*.xyz | head -1'" .
    
por 09.11.2010 / 18:49