Bash поддерживает некоторый синтаксис C-стиля. Например:
Объявления / определения функций синтаксически похожи на объявления / определения функций в C, за исключением того, что вы не определяете ни параметры (которые извлекаются с использованием позиционных параметров $1, $2, [ f14], ...) и типы возврата (Bash вообще не использует типы):foo() {
# ...
}
Или снова аналогично C с использованием встроенного объявления / определения: foo() { #...; }
Следует отметить, что при использовании встроенного объявления / определения первый и последний оператор должны быть разделены пробелами между { и } соответственно и что (опять же аналогично C) каждый оператор должен быть разделен точкой с запятой от других и что окончательный оператор должен заканчиваться точкой с запятой: foo() { command1; command2; command3; }
Для полноты альтернативного способа объявления / определения функции используется ключевое слово function, которое не нуждается в () после имени функции: function foo {
#...
}
Вы можете оценить выражение C-стиля, включив их в двойная скобка (()): поддерживается множество операторов C-стиля (включая назначение), например: =, >, >=, ==, !=, <, <=, &&, ||, !, среди прочего: $ i=0
$ j=1
$ ((i > j)) && echo True
$ ((i >= j)) && echo True
$ ((i == j)) && echo True
$ ((i != j)) && echo True
True
$ ((i < j)) && echo True
True
$ ((i <= j)) && echo True
True
$ ((i && j)) && echo True
$ ((i || j)) && echo True
True
$ ((\! i)) && echo True
True
$ ((\! j)) && echo True
$ ((i = j))
$ echo $i
1
$ echo $j
1
оценки выражений C-стиля можно использовать в сочетании с операторами if, while и until: if((i == 0)); then
# ...
done
while((i == 0)); do
# ...
done
until((i == 0)); do
# ...
done
. В частности, (()) также позволяет писать C-стиль for условия цикла: for((i = 0; i < 3; i++)); do
# ...
done
Оценка выражений в стиле C не поддерживает присвоение результата оценки; для этого вы можете использовать арифметическое расширение ($(())), которое допускает какое-то назначение выражений в стиле C: $ i=0
$ j=1
$ k=$((i > j))
$ echo $k
0
$ k=$((i < j))
$ echo $k
1
$ x=$((1 + 2 + 3))
$ echo $x
6
Поддерживаются также операции с приращением / уменьшением числа в стиле C / style / postfixed: ++i
i++
--i
i--
Если pstree $(pgrep a) перечисляет все потоковые процессы a, вы можете отправить SIGTERM всем из них (includesig a.sh) с помощью:
kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')
Если это не так, ни kill -$(pgrep a) (обратите внимание на -), ни pkill -P $(pgrep a) могут помочь, я предлагаю вам добавить строку в начало скриптов и добавить ее PID в один файл следующим образом:
echo $$ >>/path/to/the/pidfile
Таким образом, у вас всегда есть список PID, доступных для убийства простым:
kill </path/to/the/pidfile
Если pstree $(pgrep a) перечисляет все потоковые процессы a, вы можете отправить SIGTERM всем из них (includesig a.sh) с помощью:
kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')
Если это не так, ни kill -$(pgrep a) (обратите внимание на -), ни pkill -P $(pgrep a) могут помочь, я предлагаю вам добавить строку в начало скриптов и добавить ее PID в один файл следующим образом:
echo $$ >>/path/to/the/pidfile
Таким образом, у вас всегда есть список PID, доступных для убийства простым:
kill </path/to/the/pidfile