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

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

{ cmd1 ; cmd2 }

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

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

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

enter image description here

7
задан 18.05.2020, 12:18

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
5
ответ дан 18.05.2020, 12:20

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

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

SYNOPSIS
    { COMMANDS ; }

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

4
ответ дан 18.05.2020, 12:19

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

9
ответ дан 18.05.2020, 12:20
  • 1
    You' право ре, спасибо (возможно, книга использует старый формат). Но как возобновляет оболочку, возможную, если команды выполняются в ней? Оболочка называет ветвление? – Christian Fazzini 18.05.2020, 12:20
  • 2
    Оболочка будет заблокирована, пока команда не заканчивается. Это - на самом деле серьезное основание использовать группы. Например, при добавлении PPA, you' ll хотят сначала добавить информацию о хранилище, затем импортировать ключи, затем обновить Ваш кэш и затем установить. Если Вы вставите его как группа, то все будет выполнено в порядке. Если Вы don' t, you' ll должны ввести снова, потому что оболочка неспособна получить Ваш вход. – Kukunin 18.05.2020, 12:21

Теги

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