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

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 . Переменные и встроенные команды, влияющие на среду, не должны оставаться в силе после завершения списка.

jw013
источник
В баш и другие снаряды ...?
Джейсонвриан
3
bash - это то, о чем я спрашивал ...
Стив Браун
5
Какая разница между $()а ()?
CMCDragonkai
5
@CMCDragonkai Это $()подстановка команд, ()это подоболочка. Они оба запускают команды, разница в том, что происходит с выводом. Имена гораздо легче искать, чем символы. См. Также unix.stackexchange.com/q/213530/9537
jw013
12

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

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

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

отметка
источник