Answers:
bash定义几个元字符。来自man bash:
元字符
一个字符,当不加引号时,将单词分开。以下情况之一:
| &; ()<>空格标签
因为元字符分隔单词,所以它们是否被空格包围并不重要。管道符号,|是一个元字符,因此,正如您所注意到的,它不需要空格。
需要注意的是[,],{,},和=是不是元字符。相反,它们的含义在很大程度上取决于它们是否被空白包围。
如您所见,是否|被空格包围并不重要。让我们考虑一些通常使bash用户感到困惑的示例。考虑:
$ (date)
Sun Mar  1 12:47:07 PST 2015上面的括号强制该date命令在子shell中运行。因为(和)是元字符,所以不需要空格。相比之下:
$ {date}
bash: {date}: command not found由于{和}是不是元字符,shell对{date}作为一个词。而不是查找date命令,而是查找名为的命令{date}。因为找不到,所以将导致错误。
另一个常见的问题是test命令。以下成功工作:
$ [ abc ] && echo Yes
Yes删除空格并发生错误:
$ [abc] && echo Yes
bash: [abc]: command not found因为[和]都是不元字符,壳对待[.bashrc]作为单个字,结果,就像在date例如,是错误的。
赋值语句也对空格敏感。以下分配成功:
$ v=date
$ echo $v
date添加一个空格,分配失败:
$ v= date
Sun Mar  1 12:55:05 PST 2015在上面,shell暂时设置v为空,然后执行date命令。
在前面添加一个空格=也会导致失败,但原因有所不同:
$ v =date
bash: v: command not found在此,shell尝试v使用arguments 来执行命令=date。该错误是因为未找到名为的命令v。
=。花了一段时间调试。
                    管道使您可以将程序的输出用作另一个程序的输入...
至于空格,它的可读性/人员偏爱只是问题,例如@jasonwryan。
“ |”之前和之后的一个空格键 是规范..
您还可以将其与-t列一起使用,不仅使您的一线纸整齐,而且使您的输出整洁。
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在一种情况下,不使用空格可能很有用。如果您未使用美式布局,则可能会被迫使用某些组合,例如   AltShiftL输入管道。虽然这本身不是问题,但其结果是,有时您还会在该字符之前或之后输入非打印字符。例如,在法语Macbook Pro键盘上,我必须使用AltShiftL输入|。当你快速输入,你可以不小心输入:AltShift(L,Space)
$ 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如果您不知道AltShiftSpace输入了另一个空格(非中断空格(U + 00A0)),则可能很难理解以下错误:zsh: command not found:  tail