Как скобки интерпретируются в командной строке?


45

Читая о том, как настроить grub, я наткнулся на статью, утверждающую, что мне нужно использовать один из следующих двух синтаксисов:

echo \(hd0,0\) >> /boot/grub/grub.conf

или

echo '(hd0,0)' >> /boot/grub/grub.conf

потому что в командной строке скобки интерпретируются особым образом. Что особенного в скобках? Как они интерпретируются?

Ответы:


46

Скобки обозначают подоболочку в bash. Цитировать man bashстраницу:

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

где listпросто нормальная последовательность команд.

Это на самом деле довольно переносимо и не специфично для всего bash. Спецификация языка команд оболочки POSIX имеет следующее описание (compound-list)синтаксиса:

Составить составной список в среде подоболочки; см. Среда выполнения Shell . Переменные и встроенные команды, влияющие на среду, не должны оставаться в силе после завершения списка.


В баш и другие снаряды ...?
Джейсонвриан

3
bash - это то, о чем я спрашивал ...
Стив Браун

5
Какая разница между $()а ()?
CMCDragonkai

5
@CMCDragonkai Это $()подстановка команд, ()это подоболочка. Они оба запускают команды, разница в том, что происходит с выводом. Имена гораздо легче искать, чем символы. См. Также unix.stackexchange.com/q/213530/9537
jw013

12

Список команд, заключенный в скобки, работает как подоболочка.

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

Смотрите Linuxtopia - Глава 20. Подоболочки

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.