Кто ест данные? Xargs?

Большинство оболочек, подобных Борну, за исключением zsh и ksh , запускают каждую часть конвейеров в подоболочках. Предполагая, что вы не используете zsh или ksh , то в вашем скрипте последняя часть pipiline была запущена в подоболочке, поэтому exit закроет эту подоболочку вместо текущая оболочка.

Вы получите желаемый результат в zsh или ksh .

В любом случае, этот код имеет много недостатков:


Если все, что вам нужно, это получить первый символ в файл:

dd bs=1 count=1 if=/etc/passwd 2>/dev/null

или с GNU dd :

dd status=none bs=1 count=1 if=/etc/passwd

Он работает только с символами ASCII. Для многобайтовых символов:

LC_ALL=en_US.utf8 awk '{print substr($0,1,1);exit}'

Измените LC_ALL на то, к какому языку принадлежит ваш текст.

2
12.03.2019, 15:42
1 ответ

Чтобы увидеть, имеет ли значение xargs, запустите командные строки, которые он запускает. Вот несколько способов точно увидеть, что он запускает, не рискуя изменить то, что он запускает:

  • Напишите сценарий с именем phpво временном каталоге и поместите его в начало $PATH. В этом скрипте запишите аргументы (и при необходимости запустите настоящий phpпосле ).
  • Запустите всю командную строку с помощью механизма ведения журнала, такого как strace.

Вы обнаружите, что команда похожа на

php -l./bootstrap/app.php./bootstrap/autoload.php./bootstrap/cache/services.php …

Следующим шагом будет изучение того, что делает эта команда.

Я не знаком с php, но я предполагаю, что он обрабатывает только первое имя файла как имя сценария PHP, а в режиме lint он просто игнорирует все последующие аргументы. Таким образом, вам нужно запустить php -lодин раз для каждого скрипта, всего 12147 раз, вместо использования группового поведения xargs.

Самый простой способ сделать это

find. -name \*.php -exec php -l {} \;

, но эта команда всегда будет возвращать 0, даже если некоторые вызовы phpвозвращают ненулевой статус. Хотя find в 21 веке в основном не нуждается в xargs, преимущество xargs заключается в том, что он возвращает ненулевой статус, если любой вызов команды возвращает ненулевой статус. Поэтому запустите xargs, но скажите ему обрабатывать только один файл за раз с опцией -n.

find. -name \*.php -print0 | xargs -0 -n 1 php -l
7
27.01.2020, 21:52

Теги

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