Что ;
означает в однострочных скриптах, подобных этому:
while true; do sudo -n true; sleep 60; kill -0 '$$' || exit; done 2>/dev/null &
Означает ли это новую строку или «следующую команду»?
решение1
Это разделитель команд. Хотя в первом случае, возможно, лучше было бы думать о нем как о конце оператора while
.
Например, если вы хотите выполнить цикл, пока какая-то команда возвращает успешное выполнение, вы должны сделать что-то вроде
while test -f /foo; do some_command; done`
Точка с запятой используется для обозначения конца аргументов для test
. В противном случае он бы подумал, что do
это еще один аргумент для test
.
Однако вы можете использовать новые строки вместо точки с запятой. Следующий пример будет полностью эквивалентен примеру выше, только без точек с запятой
while test -f /foo
do
some_command
done
На самом деле, если в bash вы выполните указанную выше команду, а затем после ее завершения (или нажмете CTRL+C) вернетесь в историю (используя клавиши со стрелками вверх или что-то еще), вы заметите, что многострочная команда заменяется на команду, в которой вместо нее используются точки с запятой.
Так что да, синтаксис для таких вещей, if
как и while
ломает нормальное поведение оболочки.
Лично я всегда считал синтаксис странным, так как do
выглядит странно. Но к нему привыкаешь.