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

2023-10-25 03:50

本文主要是介绍为什么元字符周围有时需要空格?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文翻译自:Why is whitespace sometimes needed around metacharacters?

A few months ago I tattooed a fork bomb on my arm, and I skipped the whitespaces, because I think it looks nicer without them. 几个月前,我在手臂上纹了一个叉形炸弹 ,我跳过了空白,因为我觉得没有它们看起来更好。 But to my dismay, sometimes (not always) when I run it in a shell it doesn't start a fork bomb, but it just gives a syntax error. 但令我沮丧的是, 有时 (并不总是)当我在shell中运行它时它不会启动一个fork炸弹,但它只是给出了一个语法错误。

bash: syntax error near unexpected token `{:'

Yesterday it happened when I tried to run it in a friend's Bash shell, and then I added the whitespace and it suddenly worked, :(){ :|:& };: instead of :(){:|:&};: 昨天它发生在我试图在朋友的Bash shell中运行它,然后我添加了空格,它突然起作用, :(){ :|:& };:而不是:(){:|:&};:

Does the whitespace matter; 空白是否重要; have I tattooed a syntax error on my arm?! 我的胳膊上有语法错误吗?!

It seems to always work in zsh , but not in Bash. 它似乎总是在zsh中工作,但在Bash中不起作用。

A related question does not explain anything about the whitespaces, which really is my question; 一个相关的问题没有解释关于空白的任何事情,这确实是我的问题; Why is the whitespace needed for Bash to be able to parse it correctly? 为什么Bash需要的空白能够正确解析它?


#1楼

参考:https://stackoom.com/question/1QtdM/为什么元字符周围有时需要空格


#2楼

Braces are more like odd keywords than special symbols, and do need spaces. 大括号更像是奇数关键字而不是特殊符号,并且需要空格。 This is different to parentheses, for example. 例如,这与括号不同。 Compare: 相比:

(ls)

which works, and: 哪个有效,并且:

{ls}

which looks for a command named {ls} . 它查找名为{ls}的命令。 To work, it has to be: 要工作,必须是:

{ ls; }

The semicolon stops the closing brace being taken as a parameter to ls . 分号将关闭括号停止作为ls的参数。

All you have to do is tell people that you are using a proportional-font with a rather narrow space character. 您所要做的就是告诉别人您正在使用具有相当窄的空格字符的比例字体。


#3楼

and then I added the whitespace and it suddenly worked ... 然后我添加了空白,它突然起作用了......

It's because of how the shell parses. 这是因为shell解析的方式。 You need a space after the function definition begins, ie after the { . 在函数定义开始之后,即在{之后,您需要一个空格。

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

are valid. 是有效的。 On the other hand, 另一方面,

foo() {echo hey&}

isn't. 不是。


You actually need a tatoo like this: 你真的需要像这样的纹身:

在此输入图像描述


From the source : 从来源 :

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

Omitting a space after the { causes the {echo to be interpreted as a single token. {导致{echo被解释为单个标记之后{省略空格。


An equivalent form of 一种等效的形式

:(){ :|:& };:

would be 将会

:(){
:|:& };:

Note that there is no space after { in the alternate version, but a line-break causes the shell to recognize { as a token. 请注意, {在备用版本之后没有空格,但换行符会导致shell识别{作为标记。


#4楼

There is a list of characters that separate tokens in BASH. 在BASH中有一个用于分隔标记的字符列表。 These characters are called metacharacters and they are | 这些字符称为元字符 ,它们是| , & , ; & ; , ( , ) , < , > , space and tab . ()<>空格制表符 On the other hand, curly braces ( { and } ) are just ordinary characters that make up words. 另一方面,花括号( {} )只是构成单词的普通字符。

Omitting the second space before } will do, since & is a metacharacter. }之前省略第二个空格将会这样做,因为&是一个元字符。 Therefore, your tattoo should have at least one space character. 因此,您的纹身应该至少有一个空格字符。

:(){ :|:&};:

#5楼

Although not easily visible in the tatoo font, there's actually a Byte-Order Mark (BOM) between the brace and the colon (you may have been sufficiently intoxicated when you got the tatoo that you didn't notice it, but it's really there). 虽然在纹身字体中不容易看到,但是在支架和冒号之间实际上有一个字节顺序标记(BOM)(当你得到你没注意到它的纹身时,你可能已经充分陶醉了,但它确实存在) 。 This leaves three obvious possibilities: 这留下了三个明显的可能性

  1. You've failed to type in the BOM when you transcribed the code. 转录代码时,您无法输入BOM。 The result is an obvious application of GIGO. 结果是GIGO的明显应用。 The shell simply doesn't recognize a BOM that isn't present in your failed transcription. shell根本无法识别失败的转录中不存在的BOM。
  2. Your shell is too old. 你的外壳太旧了。 It doesn't recognize Unicode characters, so the BOM (and probably all other Unicode characters) is being ignored completely, even though a BOM anywhere but the beginning of a file is supposed to be treated as a zero-width, non-breaking space. 它无法识别Unicode字符,因此BOM(以及可能是所有其他Unicode字符)被完全忽略,即使文件开头的任何地方的BOM都应被视为零宽度,不间断的空间。
  3. Your shell is too new. 你的shell太新了。 Use of a BOM as a ZWNBS is deprecated, and the authors have implemented a future version of Unicode in which this usage is no longer allowed. 不推荐使用BOM作为ZWNBS,并且作者已经实现了Unicode的未来版本,其中不再允许使用此用法。

#6楼

Just tattoo a 只是纹身一个

#!/bin/zsh

shebang above it and you'll be fine. 在它上面的shebang,你会没事的。

这篇关于为什么元字符周围有时需要空格?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/279837

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

js基础需要注意的点

1 js中单引号和双引号都能创建字符串,但是html的元素属性规定必须用双引号,所以js优先用单引号定义字符串。

作为刚从事Java开发的小白,需要掌握哪些技能

作为一个刚踏入Java开发世界的小白,面对各种技术和工具,你可能会觉得有点不知所措。但是别担心,我会给你一个简单清晰的路线图,让你可以有条不紊地掌握基本技能,逐步成长为一名Java开发者。 1. 扎实的Java基础 Java的基础是你迈向高级开发的重要基石,建议从以下几个方面着手: 语法和基础概念:比如变量、条件语句、循环、方法、数组、面向对象编程(OOP)等等。这些基础如同建房子的地基,越

【微信小程序】如何加空格?

排除: 直接加&nbsp;是没有效果的。直接按空格键是没有效果的。 解决: 给文字加上 decode="{{true}}" 属性之后再用&nbsp; <text decode="{{true}}">医院&nbsp;&nbsp;</text><text>科室</text>

xml数据作为表单参数在网络传递也需要用urlencode处理

xml数据作为表单参数在网络传递也需要用urlencode处理。才能确保数据被正确的传递和解析。需要加深对数据在web上传递的理解。