xargs
завершит работу со статусом выхода от 1 до 125. (123 с GNU xargs
), если какая-либо из команд завершится неудачно, и прервется, если какая-либо из команд завершится ошибкой, со статусом 255.
Чтобы надежно использовать xargs
на выходеfind
(с-print0
)и сохранить стандартный ввод команды, вам понадобится GNU xargs
. Итак, с GNU xargs
и оболочкой с поддержкой замены процессов, такой как ksh
,zsh
илиbash
:
xargs -n1 -r0a <(find. -type f -iname '*.sh' -print0) sh./testScripts.sh
Или прервать при первом же отказе:
xargs -r0a <(find. -type f -iname '*.sh' -print0) sh -c '
for file do
sh./testScripts.sh "$file" || exit 255
done' sh
Вы также можете прервать find
при первой ошибке с (кодом POSIX):
find. -type f -name '*.[sS][hH]' -exec sh -c '
for file do
if ! sh./testScripts.sh "$file"; then
kill -s PIPE "$PPID"
exit 1
fi
done' sh {} +
(использование SIGPIPE в качестве менее шумного сигнала с некоторыми оболочками, такими какbash
). Это приведет к уничтожению find
и, таким образом, возврату с не--нулевым статусом выхода.
Чтобы получить точное значение статуса выхода (здесь последней )неудачной команды, с помощью zsh
или bash
вы также можете выполнить:
ret=0
while IFS= read -rd '' -u3 file; do
sh./testScripts.sh "$file" 3<&- || ret=$?
done 3< <(find. -type f -iname '*.sh' -print0)
Хотя с zsh
для этого даже find
не нужно:
set -o extendedglob
ret=0
for file (./**/*(#i).sh(D.)) {
./testScripts.sh $file || ret=$?
}
Похоже, Gnome знает об этой ошибке. Вы можете увидеть эволюцию проблемы здесьhttps://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2196