Цикл for name in...
передает статус выхода последней выполненной команды.
Когда вы break
выполняете цикл, сама команда break
имеет статус выхода 0 по умолчанию, который, следовательно, передается for
, что делает ваш &&
тест после done
равным к true
.
Один из способов обойти это, как вы сказали в своем -ответе. Это хороший и чистый вариант, и он хорошо работает с любой оболочкой, совместимой с POSIX.
Но у него есть один недостаток: будучи вспомогательной -оболочкой,он не полностью разделяет свою Execution Environment1 со своей "внешней" оболочкой. Он наследует его в начале выполнения, но не «распространяет» его обратно на своего «внешнего» родителя при завершении выполнения, что означает, например, что любая переменная, установленная или измененная в цикле, не будет видна после вне цикла.
Говоря о Bash, есть альтернатива :вы можете избежать оболочки sub -и по-прежнему использовать break
, заставляя ее сбой, передавая ей аргумент -1
, потому что -1
всегда является недопустимое количество циклов для выхода. Bash отобразит для этого сообщение об ошибке, но вы можете отключить его, перенаправив на 2>/dev/null
.
Однако обратите внимание, что такое поведение не совсем совместимо с POSIX, поскольку break
считаетсяспециальной сборкой -ви «специальной встроенной -в», вызывающей ошибку . ] должен выйти из не -не интерактивной оболочки (, например скрипт ).
1 [...]. Изменения, внесенные в среду подоболочки , не могут повлиять на среду выполнения оболочки . [...]
Вы не можете войти в журнал, так как журнал еще не запущен. На самом деле вся суть генераторов systemd, способных создавать новые файлы модулей, заключается в том, что они запускаются до буквально любого модуля systemd.
Однако вы можете вести журнал в буфере журнала ядра (, то есть в буфере dmesg
), и ваши сообщения будут импортированы journald вместе со всеми другими сообщениями ядра.
Для этого напишите сообщение на адрес /dev/kmsg
, опционально с префиксом важности в стиле ядра -:
echo "foobar-generator[$$]: Something's going on" > /dev/kmsg
echo "<4>foobar-generator[$$]: Warning, an error is about to occur" > /dev/kmsg
echo "<3>foobar-generator[$$]: An error just occured" > /dev/kmsg
Серьезность можно указать с помощью префиксов " <n>
", также как и в системном журнале. (Например, 3 — это ЖУРНАЛ _ОШИБКА, 4 — это ЖУРНАЛ _ПРЕДУПРЕЖДЕНИЕ, 7 — это ЖУРНАЛ _ОТЛАДКА. )И да, вам нужно добавить метку в стиле syslog -"process[pid] :".