spy*_*don 541 syntax bash shell syntax-error
几个月前,我在手臂上纹了一个叉形炸弹,我跳过了空白,因为我觉得没有它们看起来更好.但令我沮丧的是,有时(并不总是)当我在shell中运行它时它不会启动一个fork炸弹,但它只是给出了一个语法错误.
bash: syntax error near unexpected token `{:'
Run Code Online (Sandbox Code Playgroud)
昨天它发生在我试图在朋友的Bash shell中运行它,然后我添加了空白,它突然工作,:(){ :|:& };:
而不是:(){:|:&};:
空白是否重要; 我的胳膊上有语法错误吗?!
它似乎总是在zsh中工作,但在Bash中不起作用.
一个相关的问题没有解释关于空白的任何事情,这确实是我的问题; 为什么Bash需要的空白能够正确解析它?
Dmi*_*rov 267
在BASH中有一个用于分隔标记的字符列表.这些字符称为元字符,它们是|
,&
,;
,(
,)
,<
,>
,空间和标签.另一方面,花括号({
和}
)只是构成单词的普通字符.
之前省略第二个空格}
,因为它&
是一个元字符.因此,您的纹身应该至少有一个空格字符.
:(){ :|:&};:
Run Code Online (Sandbox Code Playgroud)
SzG*_*SzG 80
只是纹身一个
#!/bin/zsh
Run Code Online (Sandbox Code Playgroud)
在它上面的shebang,你会没事的.
Pet*_*ake 50
大括号更像是奇数关键字而不是特殊符号,并且需要空格.例如,这与括号不同.相比:
(ls)
Run Code Online (Sandbox Code Playgroud)
哪个有效,并且:
{ls}
Run Code Online (Sandbox Code Playgroud)
它查找命名的命令{ls}
.要工作,必须是:
{ ls; }
Run Code Online (Sandbox Code Playgroud)
分号将关闭括号停止作为参数ls
.
您所要做的就是告诉别人您正在使用具有相当窄的空格字符的比例字体.
Jer*_*fin 41
虽然在纹身字体中不容易看到,但是在支架和冒号之间实际上有一个字节顺序标记(BOM)(当你得到你没注意到它的纹身时,你可能已经充分陶醉了,但它确实存在) .这留下了三个明显的可能性
dev*_*ull 40
然后我添加了空白,它突然起作用了......
这是因为shell解析的方式.在函数定义开始之后,即在之后需要一个空格{
.
foo() { echo hey& }
foo() { echo hey&}
foo(){ echo hey&}
Run Code Online (Sandbox Code Playgroud)
是有效的.另一方面,
foo() {echo hey&}
Run Code Online (Sandbox Code Playgroud)
不是.
你真的需要像这样的纹身:
从来源:
/* We ignore an open brace surrounded by whitespace, and also
an open brace followed immediately by a close brace preceded
by whitespace. */
Run Code Online (Sandbox Code Playgroud)
在{
导致空格{echo
被解释为单个标记之后省略空格.
一种等效的形式
:(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)
将会
:(){
:|:& };:
Run Code Online (Sandbox Code Playgroud)
请注意,{
备用版本之后没有空格,但换行符会导致shell识别{
为令牌.
归档时间: |
|
查看次数: |
78978 次 |
最近记录: |