Невозможно получить идентификатор процесса из $! в bash 3.2.57

Невозможно получить идентификатор процесса из $! в bash 3.2.57

На моем удаленном сервере с 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.)

Связанный контент