bash define vários metacaracteres . De man bash :
metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab
Como os metacaracteres separam palavras, não importa se estão cercados por espaços. O símbolo de pipe, | , é um metacaractere e, portanto, como você percebeu, não precisa de espaços ao redor dele.
Observe que os metacaracteres [ , ] , { , } e = são não . Seu significado, por outro lado, depende strongmente de estarem cercados por espaços em branco.
Exemplos de quando os espaços são e não são necessários
Como você percebeu, não importa se | está cercado por espaços. Vamos considerar alguns exemplos que normalmente confundem os usuários bash. Considere:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Os parentes acima forçam o comando date a ser executado em um subshell. Como ( e ) são metacaracteres, nenhum espaço é necessário. Por contraste:
$ {date}
bash: {date}: command not found
Como { e } são não metacaracteres, o shell trata {date} como uma palavra. Em vez de procurar o comando date , ele procura um comando chamado {date} . Por não encontrar um, resulta em um erro.
Outro problema comum é o comando test . 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 ] são não metacaracteres, o shell trata [.bashrc] como uma única palavra e o resultado, assim como no exemplo date , é um erro. / p>
As instruções de atribuição também são sensíveis aos espaços. A seguinte atribuição é 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 define temporariamente v como vazio e, em seguida, executa o comando date .
Adicione um espaço antes de = também causar uma falha, mas por um motivo diferente:
$ v =date
bash: v: command not found
Aqui, o shell tenta executar o comando v com o argumento =date . O erro é porque não encontrou nenhum comando chamado v .