- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道当 grouping commands in bash 时圆括号 ()
和花括号 {}
之间的目的区别.
但为什么花括号结构在最后一个命令后需要一个分号,而对于圆括号结构,分号是可选的?
$ while false; do ( echo "Hello"; echo "Goodbye"; ); done$ while false; do ( echo "Hello"; echo "Goodbye" ); done$ while false; do { echo "Hello"; echo "Goodbye"; }; done$ while false; do { echo "Hello"; echo "Goodbye" }; donebash: syntax error near unexpected token `done'$
我正在寻找一些关于为什么会出现这种情况的见解。我不是在寻找诸如“因为文档是这样说的” 或“因为它是那样设计的” 这样的答案。我想知道为什么它是这样设计的。或者它是否只是一件历史文物?
这至少可以在以下版本的 bash 中观察到:
最佳答案
因为 {
和 }
只有当它们是命令中的第一个单词时才会被识别为特殊语法。
这里有两个重要的点,都可以在definitions section中找到。 bash 手册。首先是元字符列表:
metacharacter
A character that, when unquoted, separates words. A metacharacter is a blank or one of the following characters: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’.
该列表包括圆括号但不包括大括号(既不是花括号也不是方括号)。请注意,它不是对 shell 具有特殊含义的字符的完整列表,而是分隔标记的字符的完整列表。所以 {
和 }
不会分隔标记,只有当它们与元字符(例如空格或分号)相邻时才会被视为标记本身。
虽然大括号不是元字符,但它们在 parameter expansion 中被 shell 特殊对待。 (例如 ${foo}
)和 brace expansion (例如 foo.{c,h}
)。除此之外,他们只是普通的角色。例如,将文件命名为 {ab}
或 }{
是没有问题的,因为这些词不符合任一参数扩展的语法(这需要$
在 {
之前)或大括号扩展(这需要在 {
和 }
之间至少有一个逗号)。就此而言,您可以使用 {
或 }
作为文件名,而无需引用符号。同样,您可以调用文件 if
、done
或 time
,而无需考虑引用名称。
后面这些标记是“保留字”:
reserved word
A word that has a special meaning to the shell. Most reserved words introduce shell flow control constructs, such as
for
andwhile
.
bash 手册不包含完整的保留字列表,这很不幸,但它们肯定包括 Posix 指定的:
! { }
case do done elif else
esac fi for if in
then until while
以及 bash(和其他一些 shell)实现的扩展:
[[ ]]
function select time
这些词与内置词(如[
)不同,因为它们实际上是shell语法的一部分。内置函数可以作为函数或 shell 脚本实现,但保留字不能,因为它们会改变 shell 解析命令行的方式。
保留字有一个非常重要的特性,bash 手册中实际上没有突出显示,但在 Posix 中非常明确。 (除时间
外,上述保留字列表均取自于此):
This recognition [as a reserved word] shall only occur when none of the characters is quoted and when the word is used as:
- The first word of a command …
(识别保留字的地方的完整列表略长,但以上是一个很好的总结。)换句话说,保留字只有在命令的第一个字。而且,由于 {
和 }
是保留字,如果它们是命令中的第一个单词,它们只是特殊语法。
例子:
ls } # } is not a reserved word. It is an argument to `ls`
ls;} # } is a reserved word; `ls` has no arguments
关于 shell 解析,尤其是 bash 解析,我还有很多可以写的,但它们很快就会变得乏味。 (例如,关于何时 #
开始注释以及何时它只是一个普通字符的规则。)大概的总结是:“不要在家里尝试这个”;实际上,唯一可以解析 shell 命令的是 shell。并且不要试图理解它:它只是任意选择和历史异常的随机集合,其中许多但并非全部基于不使用新功能破坏古老的 shell 脚本的需要。
关于Bash 命令组 : Why do curly braces require a semicolon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246552/
使用 ABC 加载模块 ( require )在分发的一个模块中工作,而在分发的另一个模块中失败。 加载 ABC 的原因可能是什么?与 require在一个地方失败? require Name::AB
我定义了以下方法: void Write(string fileContent, string fileName, string container = StorageBlobContainers.P
现在,Require.js是我最喜欢的Javascript编程方式。它可以使代码化整为零,并易于管理。而Require.js Optimizer能帮助我们将一个较大的应用分散成多个较小的应用,并通过
尝试开始使用 apioto http://apiato.io/A.getting-started/installation/ 如果我尝试测试 http://api.apiato.dev/registe
浏览 MDN 文档以查看提议的伪类的状态时,我遇到了 :required(并且扩展为 :optional)。这两个都已经存在很长时间了,但我现在才刚刚了解到。 此选择器与使用属性选择器 [requir
我正在尝试实现此条件:如果存在特定属性,则需要另一个属性;但如果它不存在,则不需要另一个。 另外,在 JSON 模式中,我们可以在依赖项中使用 not 吗? 这是一个示例架构 var schema =
我正在使用react-hot-loader我对其示例代码感到非常困惑: import React from 'react' import ReactDOM from 'react-dom' impor
过去几天我一直在玩 requirejs。我试图理解定义和要求之间的区别。 Define 似乎允许模块分离并允许遵守依赖关系顺序。但它会下载开始时所需的所有文件。而 require 仅在您需要时加载您需
我的项目是使用 angular cli [版本 - 6.1.3] 创建的。 我安装了 npm 模块 - is-reachable并在我的代码中使用它作为 - const isReachable = r
(有人可能会相应地更改标题)当像这样调用 javascript 的 require 方法时到底发生了什么: var xyz = require('xy')(require('z')); 谢谢 最佳答案
我一直在使用编译为 Node 代码的 Typescript 开发应用程序。因此,我更喜欢使用 import 语句来 require。 我一直在尝试将 Lodash 与 Lodash-Deep 一起使用
我在 require 中有一个奇怪的行为,我不知道如何避免(或者也许我的基础知识错误?)。 考虑以下代码: define (require) -> potoo = require "potoo"
这两种加杏仁和不加杏仁有什么区别? require('模块');require(['模块']); 编辑 嵌套: define(function() { require('module'); } def
我愿意使用 require.js 优化器优化我的 javascript 应用程序,但我现在想知道是否也可以在一个文件中包含 require.config 路径和 javascript 模块。事实上,在
我想我需要在一个页面中支持多个 require 实例,但在实现它时遇到了两个问题。我正在开发一项服务,该服务向外部客户端页面提供可嵌入的交互式对象。最重要的设计标准是易于嵌入,尽可能少地假设客户端环境
required 和 ng-required(表单验证)之间有什么区别? 最佳答案 AngularJS 表单元素查找 required属性来执行验证功能。 ng-required允许您设置requir
我有以下多选框: 0" /> 在我的 Controller 中,我在初始化时执行此操作: $scope.form.Slides = []; 如果幻灯片数组中有幻灯片,我希望表单的此元素有效。这些是动
我在 ubuntu 上运行 VPS: Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 C
我正在使用 ArcGIS API for Javascript 3.21。我在 require() 中有一个函数。我希望在单击按钮时调用该函数,但该按钮位于 require() 之外。
我的浏览器应用程序使用 require.js。该应用程序在屏幕上显示许多不同的小部件之一。 URL 片段包含小部件的路径(require.js 路径),然后调用 require 来动态加载它: var
我是一名优秀的程序员,十分优秀!