Espaços ao lado de tubulações

15

Eu vi history | grep blah e history |grep blah ; e history|grep blah também funciona, embora ninguém pareça usá-lo.

Existe algum significado nos espaços (por exemplo, a tubulação para / de comandos diferentes requer uso diferente de espaços) ou é sempre arbitrária?

    
por EmmaV 01.03.2015 / 20:54

4 respostas

23

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 .

    
por 01.03.2015 / 21:45
3

Pipes permitem que você use a saída de um programa como a entrada de outro ...

No que diz respeito a espaços, é apenas uma questão de legibilidade / preferência pessoal como @jasonwryan mencionada.

Uma barra de espaço antes e depois de "|" é a norma ....

Você também pode usá-lo com a coluna -t, para não apenas tornar o seu alinhador perfeito, mas também sua saída.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp
    
por 01.03.2015 / 21:25
2

Há um caso em que pode ser útil não usar espaços. Se você não estiver usando um layout americano, você pode ser forçado a usar algumas combinações como Alt Deslocar L para inserir um pipe. Embora isso não seja um problema em si, uma consequência é que às vezes você também insere caracteres não imprimíveis antes ou depois desse caractere. Por exemplo, em um teclado francês do MacBook Pro, eu tenho que usar Alt Deslocamento L para inserir | . Quando você digita rapidamente, você pode acidentalmente digitar: Alt Deslocamento ( L , Espaço )

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |   �   �   t   a
0000020    i   l  nl

Se você não está ciente de que o Alt Desloca Espaço insere um espaço diferente (o espaço não quebra) (U+00A0 )), o seguinte erro pode ser difícil de entender: zsh: command not found:  tail

    
por 02.03.2015 / 00:12
1

A única significância dos espaços neste caso é a estética.
Ou, em outras palavras, útil para tornar os comandos mais legíveis para um ser humano.

    
por 01.03.2015 / 21:17

Tags