Да, вы видите оптимизацию. Технически, конструкция (…)
всегда запускает подоболочку по определению. В большинстве случаев подоболочка запускается в отдельном подпроцессе. Это гарантирует, что все, что делается в подоболочке, остается в подоболочке. Если bash может гарантировать это свойство изоляции, он может свободно использовать любую технику реализации, которая ему нравится.
Во фрагменте ( ps -o pid,ppid,cmd )
очевидно, что ничто не может повлиять на родительскую оболочку, поэтому в bash есть оптимизация, которая не позволяет создавать отдельный процесс для подоболочки. Фрагмент ( echo hello ; ps -o pid,ppid,cmd )
слишком сложен, чтобы оптимизатор мог распознать, что подоболочка не нужна.
Если вы поэкспериментируете с ksh
, вы заметите, что его оптимизатор более агрессивен. Например, он также не разветвляет подпроцесс для ( echo hello ; ps -o pid,ppid,cmd )
.