bash
define 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 date
comando 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 test
comando. 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 v
como vazio e, em seguida, executa o date
comando.
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 v
com o argumento =date
. O erro ocorre porque não encontrou nenhum comando nomeado v
.