1

Я пытался использовать команду как

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

Но это не работает. Если я повторю значение команды внутри обратных тиков и введу его вручную в команду cp, это сработает. Есть идеи?

2 ответа2

1

Текст, созданный обратными чертами (или альтернативным синтаксисом $(…)), подобно тексту, полученному в результате подстановки переменной ($foo), расширяется оболочкой: он разбивается на слова, и слова интерпретируются как шаблоны глобуса (то есть \[?* работать, чтобы соответствовать файлам). Чтобы избежать этой проблемы, всегда используйте двойные кавычки вокруг переменных и подстановок команд.

Есть вторая проблема: парсинг вывода ls - плохая идея по разным причинам.

Если вы используете zsh в качестве оболочки, простой способ сделать то, что вы пытаетесь

cp ~/temp/*.xyz([1]) ./

На других оболочках это сложнее. В командной строке вы можете рискнуть использовать ls , если знаете, что ваш файл не содержит непечатаемых символов (для определения ls непечатного). В сценарии это требует катастрофы; простой двухслойный в ksh или bash

tmp=(~/temp/*.xyz)
cp -- "${a[0]}" ./

На других оболочках вы можете сделать это следующим образом (обратите внимание, что это перезаписывает позиционные параметры):

set -- ~/temp/*.xyz
cp -- "$1" ./
0

Возможно, соответствующий файл содержит специальные символы (например, пробелы), поэтому вам нужно заключить в кавычки выражение обратной галочки:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .