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