Я думаю, проблема связана с системой зависимостей systemd
.
Похоже, что может происходить такая логика выключения :
когда два блока с зависимостью порядка между ними выключаются, применяется обратный порядку запуска . т.е. если блок настроен с помощью After = на другом блоке, первый останавливается перед вторым, если оба выключены.
Однако ваш пример сценария не показывает, что вы создали зависимость между одним и другим.
Я попытался запустить ваш пример сценария «A», но он не запустился:
Failed at step USER spawning /usr/bin/yes: No such process
(я тестировал на Ubuntu 16.04).
Хотя я по-прежнему предпочитаю подход awk
(более разборчивый, более похожий на оболочку, более эффективный), это один случай, когда использование цикла оболочки будет работать относительно хорошо:
for file in *; do
IFS='|' read -r x x x x x x x text x < "$file" || continue
printf '%s\n' "$file: $text" || exit
done
Для передачи файлов в awk
мы можем использовать оболочку globstar. -F
может использоваться для определения разделителя полей, поэтому -F '|'
- это то, что нам нужно. И чтобы получить только первую строку, достаточно использовать nextfile
. Таким образом, мы можем сделать:
awk -F'|' '{print FILENAME,$8;nextfile}' ./*
из папки, в которой находятся файлы.
Следует отметить, что nextfile
может не поддерживаться. Например, как заметил Стефан, Debian и его производные поставляются со старой версией mawk
, в которой нет опции nextfile
. В случае, когда вам нужно иметь более переносимый код awk, вы можете воспользоваться переменной FNR
. Например:
awk -F'|' 'FNR==1{print FILENAME,$8}' ./*
find . ! -name . -prune -exec test -f {} \; -exec sh -c '
printf "%s:%s\n" "$1" "$(head -q -n 1 "$1" | cut -d\| -f8)"
' {} {} \;