Выполнение строк файла с помощью xargs, используя перенаправление stdout
У меня есть файл, который имеет строки, которые выглядят так:
"http://api.domain.com/path/to/resource?format=json" > output.xml
и я выполняю следующее из моей командной строки:
cat file | xargs -L 1 -I {} wget {}
К сожалению, команда выглядит так, как будто она выполняется, но файл не создается. Когда я использую команду:
cat file | xargs -L 1 -I {} echo {}
Он печатает строки файла без двойных кавычек. Я думаю, что это может быть источником проблемы. Как мне их включить?
Как правильно выполнить wget
команда?
1 ответ
Кавычки, операторы перенаправления и т. Д. Обычно анализируются вашей оболочкой перед созданием массива argv[]. >
раздевается; оболочка выполняет перенаправление. Цитаты убраны; оболочка выполняет разбиение слов.
При использовании xargs вся строка ввода переходит непосредственно к argv[], а кавычки и операторы передаются в wget, который не знает, что с ними делать.
Чтобы проанализировать такие входные файлы, как у вас, вам потребуется получить помощь из оболочки двумя возможными способами.
< file xargs -d '\n' -I {} sh -x -c "wget {}"
Сюда, file
читается построчно, не позволяя xargs делать какое-либо разбиение (-d '\n'
) и передается в оболочку sh как часть командной строки. -x
Опция sh позволяет увидеть команды, которые он выполняет.
while read -r line; do
eval "wget $line"
done < file
Здесь то же самое делается с использованием только встроенных функций текущей оболочки - sh, bash или совместимых.