如何在命令行解释括号?

Ste*_*own 55 shell bash quoting

在阅读如何设置时grub,我发现一篇文章声称我需要使用以下两种语法之一,

echo \(hd0,0\) >> /boot/grub/grub.conf
Run Code Online (Sandbox Code Playgroud)

或者

echo '(hd0,0)' >> /boot/grub/grub.conf
Run Code Online (Sandbox Code Playgroud)

因为,在命令行中,括号以一种特殊的方式被解释。括号有什么特别之处?它们是如何解释的?

jw0*_*013 58

括号表示 bash 中的子shell。引用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.
Run Code Online (Sandbox Code Playgroud)

其中 alist只是一个正常的命令序列。

这实际上是非常便携的,而不是特定的bash。该POSIX shell命令行语言规范具有对下面的描述(compound-list)语法:

在子shell环境中执行复合列表;请参阅外壳执行环境。列表结束后,影响环境的变量赋值和内置命令将不再有效。

  • `$()` 和 `()` 之间有什么区别? (9认同)
  • @CMCDragonkai `$()` 是命令替换,`()` 是一个子shell。它们都运行命令,不同之处在于输出会发生什么。名称比符号更容易搜索。另见 http://unix.stackexchange.com/q/213530/9537 (7认同)
  • bash 是我要问的那个... (3认同)

mar*_*ark 17

括号之间嵌入的命令列表作为子shell 运行。

子外壳中的变量在子外壳中的代码块之外不可见。父进程和启动子 shell 的 shell 无法访问它们。这些实际上是局部变量。

参见Linuxtopia - 第 20 章。 Subshel​​l