Para enfatizar um fato muito importante em uma linguagem mais simples:
Os caracteres que você digita na tela podem ou não ser "vistos" (recebidos) pelo comando que você está invocando. Você provavelmente está familiarizado com isso; isso acontece toda vez que você cita algo.
O shell vê todos os caracteres que você digita. O shell tem suas próprias regras para o que faz com esses caracteres. Por exemplo, o comando echo
"vê" exatamente a mesma coisa em cada uma das instâncias a seguir:
$ echo hello
hello
$ echo "hello"
hello
$ echo 'hello'
hello
$ echo \h\e\l\l\o
hello
$ echo 'h'"e"\l$'lo'
hello
$ somevar=hello;echo $somevar
hello
$ somevar='h'"el"\l\o;echo $somevar
hello
$
Da mesma forma que as aspas e barras invertidas acima nunca são "vistas" pelo comando echo
, o shell manipula parênteses especialmente. Então, quando não são citados, eles não são vistos por nada além do shell.
Um bom exemplo disso é o comando find
, que aceita parênteses como argumentos . Para que os parênteses atinjam o comando find
e não sejam interpretados especialmente pelo shell, eles devem ser citados ou escapados para remover seu significado especial para o shell. Note que as aspas e as fugas não não alcançam o comando find
; somente os parênteses fazem:
(De outra pergunta neste site:)
# What you type:
find ~ \( -type f '-ex'ec ch\mod 600 {} + ')' -o \
"(" -type d -exec c"hmo"d 700 {} ';' \)
# What the find command sees:
/home/tim ( -type f -exec chmod 600 {} + ) -o ( -type d -exec chmod 700 {} ; )
# If you typed this...
find ~ \( -type f -exec chmod 600 {} + ) -o \
\( -type d -exec chmod 700 {} + \)
# ...find doesn't see anything, because bash runs into an error condition
# before it can even parse the line. That close paren is special to bash.
Existe também uma gíria relacionada a isso. Quando você pretende ter um comando "ver" um caractere especial (geralmente uma aspa ou aspas duplas, mas também pode incluir barras invertidas ou caracteres de espaço) e devido a um erro em suas citações e escape, o comando nunca vê esse caractere, nós digamos que a concha "comeu" a citação.
Um exemplo divertido de citar (e as dificuldades que podem cercá-lo) incluem: Escreva um comando ssh que faça login em um servidor remoto, inicie uma sessão bash e execute um comando sed
para modificar um SQL consulta que é armazenada em um arquivo para que seja citado corretamente para inclusão em uma mensagem HTTP.
Com tudo isso dito, aqui está a resposta curta para:
- "the '(' and ')' operators have been marked obsolescent".
Are ( and ) the operators that group commands, and create subshell?
If they are obsolete, what are their replacement?
Os parênteses ainda têm um significado especial para o shell, e isso não é obsoleto. O que é obsoleto é passar parênteses ao comando test
(citando-os para evitar que o shell os coma).
* Isso depende claramente da sua definição de "diversão".