На моем удаленном сервере с bash 4.2.46 я могу сделать это:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646
Однако на моем Mac с bash 3.2.57 это не работает:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found
Что происходит? Каким-то образом я bash
годами пользовался macOS и никогда не сталкивался с этой проблемой... но клянусь, я запускал множество программ оболочки, которые используют именно этот $!
метод для получения идентификатора фонового процесса, и ни разу не видел, чтобы они ломались.
решение1
Это !
символ-триггер дляистория расширение, включен в интерактивных оболочках по умолчанию.
Я не думаю, что это сделает что-то полезное pid=$!;
в вашем случае или в echo "$!"
. Как вы можете видеть из сообщения об ошибке, он пытается использовать пустую строку для поиска, а не что-то вроде !foo
поиска foo
. Более новые версии Bash более разумны в этом $!
или "!"
не вызывают его, но 3.2 немного глуповат с этим.
Кажется, работает pid=$! ;
, с пробелом перед точкой с запятой. Или вы можете просто отключить расширение истории с помощью set +H
. (Обратите внимание, что"$!"
не делаетработа в 3.2.)