Como os parênteses são interpretados na linha de comando?


45

Ao ler sobre como configurar grub, deparei-me com um artigo afirmando que precisava usar uma das duas sintaxes a seguir,

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

ou

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

porque, na linha de comando, os parênteses são interpretados de uma maneira especial. O que há de especial nos parênteses? Como eles são interpretados?

Respostas:


46

Parênteses indicam um subshell no bash. Para citar a man bashpágina:

(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.

onde a listé apenas uma sequência normal de comandos.

Na verdade, isso é bastante portátil e não é específico bash. A especificação POSIX Shell Command Language tem a seguinte descrição para a (compound-list)sintaxe:

Executar lista composta em um ambiente de subcamação; consulte Shell Execution Environment . As atribuições variáveis ​​e os comandos internos que afetam o ambiente não devem permanecer em vigor após o término da lista.


Na festança e outras conchas ...?
precisa saber é o seguinte

3
bash é o que eu estava perguntando sobre ...
Steve Brown

5
Qual é a diferença entre $()e ()?
CMCDragonkai

5
@CMCDragonkai A $()substituição é comando, ()é um subshell. Ambos executam comandos, a diferença é o que acontece com a saída. Os nomes são muito mais fáceis de pesquisar do que os símbolos. Veja também unix.stackexchange.com/q/213530/9537
jw013

12

Uma lista de comandos incorporada entre parênteses é executada como um subshell.

Variáveis ​​em um subshell não são visíveis fora do bloco de código no subshell. Eles não são acessíveis ao processo pai, ao shell que lançou o subshell. Essas são, de fato, variáveis ​​locais.

Veja Linuxtopia - Capítulo 20. Subshells

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.