bash(1)
страница справочника, раздел EXPANSION, подраздел Замены Команды:
Command substitution allows the output of a command to replace the com-
mand name. There are two forms:
$(command)
or
`command`
Bash performs the expansion by executing command and replacing the com-
mand substitution with the standard output of the command, with any
trailing newlines deleted.
Кавычки то, потому что [
почти так же умно как шлакоблок и не любит пустых строк.
Проверьте статус выхода команды. Если команда была завершена сигналом, код выхода будет 128 + число сигнала. Из онлайн-документации GNU для удара:
В целях оболочки успешно выполнилась команда, которая выходит с нулевым статусом выхода. Ненулевой статус выхода указывает на отказ. Эта на вид парадоксальная схема используется, таким образом, существует один четко определенный способ указать на успех и множество способов указать на различные виды отказа. Когда команда завершается на фатальном сигнале, число которого является N, Bash использует значение 128+N в качестве статуса выхода.
POSIX также указывает, что значение команды, которая завершенный сигналом больше, чем 128, но, кажется, не указывает, что его точное значение как GNU делает:
О статусе выхода команды, которая завершилась, потому что он получил сигнал, нужно сообщить как больше, чем 128.
Например, при прерывании команды Ctrl-C, код выхода будет 130, потому что SIGINT является сигналом 2 в системах Unix. Так:
while [ 1 ]; do COMMAND; test $? -gt 128 && break; done
Я сказал бы, что могло бы быть лучше поместить Ваш бесконечный цикл в сценарий и сигналы дескриптора там. Вот основная начальная точка. Я уверен, что Вы захотите изменить его для удовлетворения. Использование сценария trap
поймать ctrl-c (или SIGTERM
), избавляется от команды (я использовал sleep
здесь как тест) и выходы.
cleanup ()
{
kill -s SIGTERM $!
exit 0
}
trap cleanup SIGINT SIGTERM
while [ 1 ]
do
sleep 60 &
wait $!
done
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
– Douglas
13.01.2013, 15:00
trap
приблизьтесь к тому же (удар) к сценарию с бесконечным циклом, который будет уничтожен, используйте $$
вместо $!
(см. здесь),
– ardnew
22.05.2017, 23:37
Я обычно просто удерживаю Ctrl-C. Рано или поздно это зарегистрируется между COMMAND
и таким образом оконечный while
цикл. Возможно, существует лучший путь.
paplay
на 1 файле с.
– Ciro Santilli 新疆改造中心法轮功六四事件
15.03.2014, 13:07
Если Вы выполняете удар с -e
это выйдет на любых состояниях ошибки:
#!/bin/bash -e
false # returns 1
echo This won't be printed
while :
создаст бесконечный цикл и сохраняет Вас пишущий [ 1 ]
while :; do COMMAND; done &
Это распечатает PID. Если Вы выходите из своего быстрого использования ctrl+d
затем фоновое задание не выйдет, и можно позже уничтожить задание отовсюду с помощью kill PID
Если Вы теряете след своего PID, можно использовать pstree -pa $USER
или pgrep -fl '.*PROCESS.*'
помочь Вам найти его
Где [1] - номер Вашей работы.[117250].
Почему не просто,
while [ 1 ]; do COMMAND || break; done;
Или при использовании в сценарии
#!/bin/bash
while [ 1 ]; do
# ctrl+c terminates COMMAND and exits the while loop
# (assuming COMMAND responds to ctrl+c)
COMMAND || break
done;
Я предпочитаю другое решение:
touch.runcmd; while [ -f ".runcmd" ]; do COMMAND; sleep 1; done
Чтобы закрыть цикл, просто выполните:
rm.runcmd && kill `pidof COMMAND`
Используйтеtrap
-
exit_()
{
exit
}
while true
do
echo 'running..'
trap exit_ int
done
Мне достаточно хорошо помогает:
while sleep 1; do COMMAND; done
Это работает, потому что sleep 1 какое-то время задерживается, и если он получает Ctrl + C, он возвращается с ненулевым значением, и цикл завершается.
paplay alert.ogg
, возможно, потому чтоpaplay
обрабатывает сигнал? – Ciro Santilli 新疆改造中心法轮功六四事件 16.03.2014, 08:49