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
.