Выполнение строк файла с помощью 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 или совместимых.

Другие вопросы по тегам