$!
гарантированно даст вам pid процесса, в котором оболочка выполнила эту tail
команду. Оболочки являются однопоточными, каждая оболочка живет в своем собственном процессе со своим набором переменных. Там нет никакого способа , $!
из одной оболочки будет течь в другую оболочку, так же , как и присваивание переменной оболочки в одной оболочке не будет влиять на переменную с тем же именем в другой оболочке (если оставить в стороне универсальных переменных на fish
оболочке) ,
Теперь, tail -f /dev/null
это команда, которая выполняется бесконечно, но для кратковременных команд, обратите внимание, что, поскольку существует ограниченное число возможных идентификаторов процессов, идентификаторы процессов неизбежно заканчиваются тем, что будут повторно использованы.
В:
true &
pid=$!
Он $pid
будет содержать идентификатор процесса, в котором запускалась оболочка true
, но к тому времени, когда вы его используете $pid
, этот pid может быть уже мертв и может ссылаться на другой процесс.
$jobstate/$jobtext
для проверки там состояния процесса. Не без гонки, так как ребенок уже пожинает плоды во время выполнения ловушки, но это означает, что очень короткие гоночные окна, где очень маловероятно, что пидс будут повторно использованы.