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