Bash - выполнение команд в текущей оболочке

Я читал книгу О'Рейли «Unix в двух словах» и увидел там, что команды могут быть сгруппированы и выполнены в текущей оболочке, используя следующий формат:

{ cmd1 ; cmd2 }

Я не сделал ' Я не понимаю, как это возможно, поскольку я знал, что вызов exec заменяет данные оболочки, и поэтому оболочка не может вернуться из системного вызова exec. Итак, я проверил команду и не могу понять, что случилось. Я ввел командную строку, и я не уверен, к чему относится командная строка.

Это просто командная строка эмулятора терминала, удаленная из оболочки?

Кроме того, чем полезно выполнение команд в текущей оболочке?

enter image description here

7
задан 1 April 2014 в 15:00

3 ответа

Должностному лицу или не должностному лицу

вызов должностному лицу заменяет данные оболочки, и поэтому оболочка не может возвратиться из исполнительного системного вызова.

, Но не каждая команда название программы для выполнения. Так часто нет никакого 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
0
ответ дан 1 April 2014 в 15:00

Это - потому что Вы не завершаете вторую строку: { cmd1; cmd2; } корректно. Точка с запятой означает "конец команды".

0
ответ дан 1 April 2014 в 15:00

help встроенный может быть полезно даже для { ключевое слово. От help -m {:

NAME
    { ... } - Group commands as a unit.

SYNOPSIS
    { COMMANDS ; }

Так, точка с запятой (;) обязательна после каждой команды.

0
ответ дан 1 April 2014 в 15:00

Другие вопросы по тегам:

Похожие вопросы: