bashdefine vários metacaracteres . De man bash:
metacaractere
Um caractere que, quando não está entre aspas, separa as palavras. Um dos seguintes:
| &; () <> guia de espaço
Como os metacaracteres separam as palavras, não importa se elas estão cercadas por espaços. O símbolo do tubo,, |é um metacaractere e, portanto, como você notou, não precisa de espaços ao seu redor.
Note-se que [, ], {, }, e =são não metacaracteres. Seu significado, por outro lado, depende fortemente de estar cercado por espaços em branco.
Exemplos de quando os espaços são e não são necessários
Como você notou, não importa se |é cercado por espaços. Vamos considerar alguns exemplos que geralmente confundem os usuários do bash. Considerar:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Os parâmetros acima forçam o datecomando a ser executado em um subshell. Como (e )são metacaracteres, não são necessários espaços. Por contraste:
$ {date}
bash: {date}: command not found
Como {e não} são metacaracteres, o shell trata como uma palavra. Em vez de procurar o comando, ele procura um comando chamado . Como não encontra um, ocorre um erro.{date}date{date}
Outro problema comum é o testcomando. O seguinte funciona com sucesso:
$ [ abc ] && echo Yes
Yes
Remova os espaços e ocorre um erro:
$ [abc] && echo Yes
bash: [abc]: command not found
Como [e não] são metacaracteres, o shell trata como uma única palavra e o resultado, como no exemplo, é um erro.[.bashrc]date
As instruções de atribuição também são sensíveis aos espaços. A seguinte atribuição foi bem-sucedida:
$ v=date
$ echo $v
date
Adicione um espaço e a atribuição falhará:
$ v= date
Sun Mar 1 12:55:05 PST 2015
Acima, o shell temporariamente define vcomo vazio e, em seguida, executa o datecomando.
Adicionar um espaço antes =também causa uma falha, mas por um motivo diferente:
$ v =date
bash: v: command not found
Aqui, o shell tenta executar o comando vcom o argumento =date. O erro ocorre porque não encontrou nenhum comando nomeado v.