Я читал книгу О'Рейли «Unix в двух словах» и увидел там, что команды могут быть сгруппированы и выполнены в текущей оболочке, используя следующий формат:
{ cmd1 ; cmd2 }
Я не сделал ' Я не понимаю, как это возможно, поскольку я знал, что вызов exec заменяет данные оболочки, и поэтому оболочка не может вернуться из системного вызова exec. Итак, я проверил команду и не могу понять, что случилось. Я ввел командную строку, и я не уверен, к чему относится командная строка.
Это просто командная строка эмулятора терминала, удаленная из оболочки?
Кроме того, чем полезно выполнение команд в текущей оболочке?
вызов должностному лицу заменяет данные оболочки, и поэтому оболочка не может возвратиться из исполнительного системного вызова.
, Но не каждая команда название программы для выполнения. Так часто нет никакого exec
включенный вызов. Ключевое различие - то, что в отличие от ( cmd1; cmd2; )
, Вы не получаете другой процесс оболочки. Или возможно более правильно, оболочка только разветвится, чтобы выполнить дочерние программы, не выполнить процессы оболочки.
, что принадлежит командная строка.
, Поскольку другие ответы указали, Ваша команда была неполной. Таким образом, командная строка принадлежала для избиения себя, который ожидал конца группы.
кроме того, как выполняет команды в текущей оболочке, всегда полезной?
, самый видный пример устанавливает переменные в той подкоманде. Ваш это:
foo=1; { foo=2; echo $foo; }; ( foo=3; echo $foo; ); echo $foo
Это распечатает
2
3
2
Поэтому, хотя Вы устанавливаете foo=3
внутренняя часть одна группа, та группа выполнялась в подоболочке, и ее настройки не распространили к родителю.
Другой вещью достойной рассмотрения является текущий рабочий каталог. { cd foo; make; }
оставит Вас в каталоге foo
, тогда как ( cd foo; make; )
не изменит текущий рабочий каталог Вашей основной оболочки.
группировка главным образом полезна, если у Вас есть другой код снаружи, например, условные выражения
test -f foo && { echo "Foo exists."; rm foo; }
или перенаправления
{ echo "Content of $PWD:"; ls; } | gzip > dirlist.gz
Это - потому что Вы не завершаете вторую строку: { cmd1; cmd2; }
корректно. Точка с запятой означает "конец команды".
help
встроенный может быть полезно даже для {
ключевое слово. От help -m {
:
NAME { ... } - Group commands as a unit. SYNOPSIS { COMMANDS ; }
Так, точка с запятой (;
) обязательна после каждой команды.