管道旁的空间


17

我见过的history | grep blahhistory |grep blah; 并且history|grep blah也可以使用,尽管似乎没有人使用过它。

空间中是否有任何意义(例如,到/来自不同命令的管道要求使用不同的空间),还是总是武断的?


13
可读性强。
jasonwryan 2015年

1
|;大多数外壳程序(bash,ksh,tcsh)使用管道或分号作为命令分隔符。如果没有用引号将空白括起来,那么前后都是无关紧要的。
Archemar

Answers:


24

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


1
我最近成为作业声明的受害者。我在前后都有空格=。花了一段时间调试。
2015年

3

管道使您可以将程序的输出用作另一个程序的输入...

至于空格,它的可读性/人员偏爱只是问题,例如@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

2

在一种情况下,不使用空格可能很有用。如果您未使用美式布局,则可能会被迫使用某些组合,例如 AltShiftL输入管道。虽然这本身不是问题,但其结果是,有时您还会在该字符之前或之后输入非打印字符。例如,在法语Macbook Pro键盘上,我必须使用AltShiftL输入|。当你快速输入,你可以不小心输入:AltShiftLSpace

$ 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


1

在这种情况下,空间的唯一意义是美学。
或者换句话说,有助于使命令更易被人阅读。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.