Я пытался использовать команду как
cp `ls ~/temp/*.xyz | head -1` ./
Но это не работает. Если я повторю значение команды внутри обратных тиков и введу его вручную в команду cp, это сработает. Есть идеи?
Я пытался использовать команду как
cp `ls ~/temp/*.xyz | head -1` ./
Но это не работает. Если я повторю значение команды внутри обратных тиков и введу его вручную в команду cp, это сработает. Есть идеи?
Текст, созданный обратными чертами (или альтернативным синтаксисом $(…)
), подобно тексту, полученному в результате подстановки переменной ($foo
), расширяется оболочкой: он разбивается на слова, и слова интерпретируются как шаблоны глобуса (то есть \[?*
работать, чтобы соответствовать файлам). Чтобы избежать этой проблемы, всегда используйте двойные кавычки вокруг переменных и подстановок команд.
Есть вторая проблема: парсинг вывода ls
- плохая идея по разным причинам.
Если вы используете zsh в качестве оболочки, простой способ сделать то, что вы пытаетесь
cp ~/temp/*.xyz([1]) ./
На других оболочках это сложнее. В командной строке вы можете рискнуть использовать ls
, если знаете, что ваш файл не содержит непечатаемых символов (для определения ls
непечатного). В сценарии это требует катастрофы; простой двухслойный в ksh или bash
tmp=(~/temp/*.xyz)
cp -- "${a[0]}" ./
На других оболочках вы можете сделать это следующим образом (обратите внимание, что это перезаписывает позиционные параметры):
set -- ~/temp/*.xyz
cp -- "$1" ./
Возможно, соответствующий файл содержит специальные символы (например, пробелы), поэтому вам нужно заключить в кавычки выражение обратной галочки:
cp "`ls ~/temp/*.xyz | head -1`" .