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