аргумент CP в обратных галочках не работает?

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

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

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

1
задан 09.11.2010, 20:40

2 ответа

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

Существует второй выпуск: парсинг вывода ls плохая идея по различным причинам.

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

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

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

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

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

set -- ~/temp/*.xyz
cp -- "$1" ./
1
ответ дан 17.12.2019, 00:30

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

cp "`ls ~/temp/*.xyz | head -1`" .
0
ответ дан 17.12.2019, 00:30

Теги

Похожие вопросы