首页 文章

为什么元字符周围有时需要空格?

提问于
浏览
534

几个月前,我在手臂上纹了一个fork bomb,我跳过了空白,因为我认为没有它们会更好看 . 但令我沮丧的是, sometimes (并非总是)当我在shell中运行它时它不会启动一个fork炸弹,但它只是给出了一个语法错误 .

bash: syntax error near unexpected token `{:'

昨天它发生在我试图在朋友的Bash shell中运行它,然后我添加了空白,它突然起作用, :(){ :|:& };: 而不是 :(){:|:&};:

空白是否重要;我的胳膊上有语法错误吗?!

它似乎始终在zsh中工作,但在Bash中不起作用 .

A related question没有解释关于空白的任何内容,这确实是我的问题; Why is the whitespace needed for Bash to be able to parse it correctly?

5 回答

  • 49

    只是纹身一个

    #!/bin/zsh
    

    在它上面的shebang,你会没事的 .

  • 40

    然后我添加了空白,它突然起作用了......

    这是因为shell解析的方式 . 在函数定义开始后,即在 { 之后,您需要一个空格 .

    foo() { echo hey& }
    foo() { echo hey&}
    foo(){ echo hey&}
    

    是有效的 . 另一方面,

    foo() {echo hey&}
    

    不是 .


    你真的需要像这样的纹身:

    enter image description here


    来自source

    /* We ignore an open brace surrounded by whitespace, and also
         an open brace followed immediately by a close brace preceded
         by whitespace.  */
    

    { 之后省略空格会导致 {echo 被解释为单个标记 .


    一种等效的形式

    :(){ :|:& };:
    

    将会

    :(){
    :|:& };:
    

    请注意,在备用版本中 { 之后没有空格,但换行符会导致shell将 { 识别为令牌 .

  • 76

    在BASH中有一个用于分隔标记的字符列表 . 这些字符称为元字符,它们是 |&;()<>spacetab . 另一方面,花括号( {} )只是构成单词的普通字符 .

    } 之前省略第二个空格将会这样做,因为 & 是一个元字符 . 因此,您的纹身应该至少有一个空格字符 .

    :(){ :|:&};:
    
  • 263

    大括号更像是奇数关键字而不是特殊符号,并且需要空格 . 例如,这与括号不同 . 相比:

    (ls)
    

    哪个有效,并且:

    {ls}
    

    它查找名为 {ls} 的命令 . 要工作,必须是:

    { ls; }
    

    分号将关闭括号停止作为 ls 的参数 .

    您所要做的就是告诉别人您正在使用具有相当窄的空格字符的比例字体 .

  • 39

    虽然在纹身字体中不容易看到,但是在支架和冒号之间实际上有一个字节顺序标记(BOM)(当你得到你没注意到它的纹身时,你可能已经充分陶醉了,但它确实存在) . 这留下了三个明显的可能性

    • 您've failed to type in the BOM when you transcribed the code. The result is an obvious application of GIGO. The shell simply doesn' t识别失败的转录中不存在的BOM .

    • 你的外壳太旧了 . 它无法识别Unicode字符,因此BOM(以及可能所有其他Unicode字符)被完全忽略,即使文件开头的任何地方的BOM都应被视为零宽度,不间断的空间 .

    • 你的shell太新了 . 不推荐使用BOM作为ZWNBS,并且作者已经实现了Unicode的未来版本,其中不再允许使用此用法 .

相关问题