Eu já 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, canalizar para / de comandos diferentes requer uso diferente de espaços) ou é sempre arbitrário?
|
pipe ou;
ponto- e- vírgula são usados pela maioria dos shell (bash, ksh, tcsh) como separador de comandos. quando não estiver entre aspas, os espaços em branco antes e depois não são relevantes.Respostas:
bash
define vários metacaracteres . Deman bash
: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: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: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:Remova os espaços e ocorre um erro:
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:
Adicione um espaço e a atribuição falhará:
Acima, o shell temporariamente define
v
como vazio e, em seguida, executa odate
comando.Adicionar um espaço antes
=
também causa uma falha, mas por um motivo diferente:Aqui, o shell tenta executar o comando
v
com o argumento=date
. O erro ocorre porque não encontrou nenhum comando nomeadov
.fonte
=
. Demorou um pouco para depurar.Os tubos permitem que você use a saída de um programa como entrada de outro ...
Quanto aos espaços, é apenas uma questão de legibilidade / preferência do pessoal, como @jasonwryan mencionado.
Uma barra de espaço antes e depois de "|" é a norma ....
Você também pode usá-lo com a coluna -t, não apenas para tornar seu liner elegante, mas também para a sua saída.
fonte
Há um caso em que pode ser útil não usar espaços. Se você não estiver usando um layout norte-americano, poderá ser forçado a usar algumas combinações, como AltShiftLinserir um tubo. Embora isso não seja um problema em si, uma conseqüê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, tenho que usar AltShiftLpara inserir
|
. Ao digitar rapidamente, você pode digitar acidentalmente o seguinte: AltShift( L, Space)Se você não está ciente de que AltShiftSpaceinsere um espaço diferente (o espaço sem quebra ( U + 00A0 )), o seguinte erro pode ser difícil de entender:
zsh: command not found: tail
fonte
O único significado dos espaços neste caso é a estética.
Ou, em outras palavras, útil para tornar os comandos mais legíveis para um humano.
fonte