Большинство оболочек, подобных Борну, за исключением 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
на то, к какому языку принадлежит ваш текст.
Чтобы увидеть, имеет ли значение 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