摘要: 即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是:$ env -i bash -c exportdeclare -x OLDPWDdeclare -x PWD="/"declare -x SHLVL="1"SHLVL如果父进程传递了 SHLVL 环境变量,那...阅读全文
posted @ 2015-11-27 14:13 紫云飞 阅读(133) 评论(0) 编辑
摘要: 每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的。很多人说 Bash 中的 $0 的值就是 bash 这个 C 程序在它的 main 函数中获取到的 argv[0...阅读全文
posted @ 2015-11-27 11:32 紫云飞 阅读(102) 评论(0) 编辑
摘要: 我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序。fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 fork 子进程,直接在当前进程执行 execve()。bash -c 'command'如果用了...阅读全文
posted @ 2015-11-13 21:42 紫云飞 阅读(108) 评论(0) 编辑
摘要: 今天无意发现下面这个表现:$ env -i bash -c cdbash: line 0: cd: HOME not set$env -i bash -c 'echo $HOME'这表明了,Bash 只会从环境变量中继承 HOME 变量,从来不自己初始化它?为了证实这个想法,我去翻了下源码,发现其实...阅读全文
posted @ 2015-11-12 16:59 紫云飞 阅读(73) 评论(0) 编辑
摘要: 你有没有留意过下面这种场景:$lsfile1 file2 file3 file4 file5$ ls | catfile1file2file3file4file5单独执行 ls 时,它的输出是一行多个文件名,在它后面接个管道的话,它的输出就变成了一行一个文件名,这是为什么呢?这种表现的原理是:ls ...阅读全文
posted @ 2015-11-02 17:05 紫云飞 阅读(81) 评论(0) 编辑
摘要: Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}。根据不同的operator,它展开后的值可能是parameter 这个参数的值经过某种转换后的值,又可能是关于 parameter 参数自身的某种信息。这句话太抽象了,还是看下面的详细解释吧。op...阅读全文
posted @ 2015-10-28 21:10 紫云飞 阅读(112) 评论(0) 编辑
摘要: 在 Bash 中,有两个内置命令用来控制 Bash 的各种可配置行为的开关(打开或关闭),这些开关称之为选项(option)。其中一个命令是 set,set 命令有三种功能:显示所有的变量和函数;修改 Bash 的位置参数;控制 Bash 的第一套选项。可见 set 命令完全违背了“一个命令只干一件...阅读全文
posted @ 2015-10-27 15:29 紫云飞 阅读(146) 评论(0) 编辑
摘要: 在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或者说从没仔细考虑过)的分词细节。1. 分隔符到底是字符还是字符串?IFS 里面可以包含多个字符,那么...阅读全文
posted @ 2015-10-21 17:07 紫云飞 阅读(124) 评论(0) 编辑
摘要: read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已:$ read name1$echo "$name"1$ read1$ echo "$REPLY"1当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此而已。然而今天我却发现个细微的区别(下面为了显示...阅读全文
posted @ 2015-10-19 17:49 紫云飞 阅读(92) 评论(0) 编辑
摘要: 上文中曾讲到,我在我的 Mac 上发现很多和 Bash 内部命令同名的外部命令,在那 24 个外部命令中,我发现个奇怪的现象:它们中有 15 个居然是 Shell 脚本,更奇怪的是,居然是同一个 Shell 脚本的硬链接:$find /usr/bin -inum 376183/usr/bin/ali...阅读全文
posted @ 2015-09-26 23:54 紫云飞 阅读(151) 评论(0) 编辑
摘要: 我们知道,在 Bash 中,当变量出现在一个赋值语句的右侧时,变量只会展开,不会分词,即便变量两边没有引号:$foo="1 2"$bar=$foo # 不会被拆分成 bar=1 和 2 两个词$echo "$bar"1 2但是,当一个形似赋值语句的词,作为...阅读全文
posted @ 2015-09-25 06:13 紫云飞 阅读(105) 评论(0) 编辑
摘要: 网上经常有人问这个问题:为什么我写的 alias 在 sudo 下就不管用了?$ alias 'll=ls -l'$ sudo ll a-private-dirsudo: ll: command not found为什么会这样?因为正常情况下,alias 只有出现在一条简单命令的命令名称的位置(大部...阅读全文
posted @ 2015-09-24 08:49 紫云飞 阅读(110) 评论(0) 编辑
摘要: 昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息。有人回答他了,原因是coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受任何选项。当你在 Bash 里执行[ --help 时,当然优先执行的是内部命令 [,而不是外部命令 ...阅读全文
posted @ 2015-09-23 17:23 紫云飞 阅读(137) 评论(0) 编辑
摘要: 在上文中曾说到:所谓的环境变量的真实面目其实就是个任意字符串Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给environ本文中继续深入讲三点:environ 数组中可能存在 = 左边...阅读全文
posted @ 2015-09-22 16:17 紫云飞 阅读(121) 评论(0) 编辑
摘要: BASH_SUBSHELL 实现于 Bash 3.0,我一直想不到它在实际编码中有什么用,后来在 Bash 的 Change Log 里找到一句话,才知道它是作调试用的:New variables to support the bash debugger: BASH_ARGC, BASH_ARGV,...阅读全文
posted @ 2015-09-21 21:29 紫云飞 阅读(114) 评论(0) 编辑
摘要: 除非特别说明,本文中出现的 Shell 均指 Bash 4.3。首先说一个基础知识:Shell 中的变量在展开成值(Parameter Expansion)之后,这个值在某些上下文(Context)中,还会进行分词操作(Word Splitting),但在另外一些上下文中,不会进行分词操作。本文中把...阅读全文
posted @ 2015-09-15 11:55 紫云飞 阅读(134) 评论(0) 编辑
摘要: 在 Bash 里,可以通过export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Bash 的环境变量不一定是我们想象的那样。在 C 语言层面,环境变量是存放在一个名为environ 的全...阅读全文
posted @ 2015-09-14 16:13 紫云飞 阅读(134) 评论(0) 编辑
摘要: SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。看不懂上面这句话不要紧,因为是我临时编的。其实如果你混淆了这两个变量,我猜你多半是对BASH_SUBSHELL 这个变量名...阅读全文
posted @ 2015-09-13 08:09 紫云飞 阅读(182) 评论(1) 编辑
摘要: SHLVL 环境变量代表 Shell 嵌套执行的深度。$ echo $SHLVL1$ bash$ echo $SHLVL2$ bash$ echo $SHLVL3在 Bash 里,这个值的范围是 [0, 1000],0 是怎么来的呢?是在上次的 SHLVL 值为负数的时候:$ SHLVL=-1$ b...阅读全文
posted @ 2015-09-12 12:36 紫云飞 阅读(121) 评论(0) 编辑
摘要: $_ 有好几个功能,我们最常用的是用它来获取“刚刚执行过的命令的最后一个参数”这个功能,比如下面这样:$ ls ~/Downloads/very/long/dir/ # ls 到某个目录看看有没有我们想要的文件file1 file2 needed_file$ cd $_ # 如果有,就进入到那个文件...阅读全文
posted @ 2015-09-07 17:34 紫云飞 阅读(122) 评论(0) 编辑
摘要: 首先,我们想到的会是 export(等价于 declare -x)命令:$ export | grep 'declare -x _='没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则本篇文章就该结束了。别忘了还有 env(或者 printenv)命令:$ env | grep '_='...阅读全文
posted @ 2015-09-06 23:40 紫云飞 阅读(157) 评论(0) 编辑
摘要: 我们知道,在 Shell 中,一个变量在被展开后,如果它没有被双引号包围起来,那么它展开后的值还会进行一次分词(word splitting,或者叫拆词,分词这个术语已经被搜索引擎相关技术占用了)操作,分成几个词,传给命令的就是几个单独的参数。举个例子,比如:$ foo="1 2 3"$how_ma...阅读全文
posted @ 2015-09-04 12:19 紫云飞 阅读(104) 评论(0) 编辑
摘要: 在 Bash 里,一共有五个地方支持反斜杠开头的转义序列,包括两个内部命令 echo 和 printf 的参数里,字符串语法 $'...' 里,还有四个提示符变量 PS1-PS4 里,以及在 Readline 配置文件里(用来自定义键盘快捷键)。其中后两者不在本文的讨论范围内,我们只看看前三个命令/...阅读全文
posted @ 2015-09-03 11:47 紫云飞 阅读(121) 评论(0) 编辑
摘要: 原文:http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binary-and-octal-numbers/几年前,当SpiderMonkey实现了严格模式的时候.我了解到,严格模式禁用了八进制整数字面量的写法.因为有证据表明,一些新手会利用前导0来对齐多行中的数字,从而导致意想不到的结果:var sum = 015 + // 相当于十进制的13,而不是15 197 + 001; // 反正是1console.log(su...阅读全文
posted @ 2013-08-14 10:20 紫云飞 阅读(1422) 评论(1) 编辑
摘要: 原文:http://fiddler2.com/blog/blog/2013/02/13/understanding-the-request-line最近有一位Fiddler用户问我一个问题:我在使用Fiddler查看HTTP请求的时候发现Raw和HexView两个面板中显示的数据有点小区别,比如当我请求www.microsoft.com时,Raw面板中的数据是这样的: GEThttp://www.microsoft.com/ HTTP/1.1 ... Host: www.microsoft.com而HexView面板中是这样的: GET / HTTP/1.1 ... Host: www.mic阅读全文
posted @ 2013-07-21 13:21 紫云飞 阅读(2771) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/06/javascript-source-transformation-non-destructive-vs-regenerative.html很多的JavaScript工具都需要对JavaScript源码进行转换,包括压缩器(minifier)和转译器(transpiler).这些工具所使用的转换的技术可以分为两种:对源码进行非破坏式的(non-destructive)修改和从语法树完全再生(full regeneration)出新的源码.这两种技术服务于不同的需求,且往往是相辅相成的.无论选择哪种技术,输入的源码都需要先被解阅读全文
posted @ 2013-07-15 11:14 紫云飞 阅读(2099) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/07/es6-and-proxy.html能够拦截在一个对象上的指定操作的能力是非常有用的,尤其是在故障调试的时候.通过ECMAScript 6中的新特性——代理(proxy),这种能力才最终得以实现.在目前最新的ES6规范草案中(2013年5月14日发布,第15次修订版),第15.18小节——代理对象(Proxy Objects)这部分的文档仍然是空的.不过随着规范的日趋稳定,这里会补充上完整的参考文档的.目前,可以在ES wiki上的直接代理(Direct Proxies)页面内找到最详细的资料.在我写这篇文章的时候,只有F阅读全文
posted @ 2013-07-14 10:42 紫云飞 阅读(1174) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2012/02/from-double-quotes-to-single-quotes.html代码的不一致性总是让人发狂,如果每位开发者都能遵守约定好的编码规范(coding conventions),那么生活将变的更加美好.比如在JavaScript中,一个字符串字面量可以用单引号引起,也可以用双引号来引起(ECMAScript 5规范7.8.4小节).很多人习惯于使用某种特定的引号,比如jQuery编码风格推荐人们使用双引号.但我个人更喜欢使用单引号,这仅仅是我的偏好.自从有了Esprima,我意识到,我可以利用Esprima能够以阅读全文
posted @ 2013-07-13 11:39 紫云飞 阅读(6095) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2012/07/lazy-parsing-in-javascript-engines.html现代的JavaScript引擎可以将函数体的解析操作延迟到真正需要的时候再进行,下面我将讲一下为什么要这样做以及引擎具体是如何实现的.IE团队在最近的一篇博文"IE10和Windows 8中JavaScript性能的发展"中提到了他们使用延迟解析来提升IE10的性能.实际上,IE9正式版已经实现了这种优化手段,只不过IE10更进一步改进了它.文中有这样一句话(其中Chakra是IE的JavaScript引擎的名字):为了进一步阅读全文
posted @ 2013-04-23 21:14 紫云飞 阅读(1361) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/web-page-clipping-with-phantomjs.htmlPhantomJS的一个主要用途就是用来抓取网页并将它渲染成图片.在渲染图片时有很多选项可供调整,其中最常用的一个就是缩放选项(调整zoomFactor属性的值),它经常会被用在制作缩略图的场景下.另外一个不怎么被人熟知的选项就是"按指定矩形区域渲染"选项(调整clipRect属性的值),也就是生成的图片只包含了目标网页中被指定的那部分区域.这种只渲染页面指定矩形区域的需求通常表现为你只想获取页面中某个特定元素的内容(就像getB阅读全文
posted @ 2013-04-20 09:24 紫云飞 阅读(2447) 评论(2) 编辑
摘要: 原文:http://generatedcontent.org/post/47216611856/ie11最近,一个开发代号为Windows Blue的Windows操作系统泄漏到了互联网上,该操作系统的内置浏览器为IE11,本文将介绍一下这个泄漏版的IE11中有哪些关键的新变化和新特性.预先声明: 本文中所讲的内容都来自互联网,我自己没有安装过这个泄漏版的IE11,虽然我目前正在帮助微软的userAgents社区做一些工作,但我没有任何关于IE11未来计划的内部消息,本文只是对网上的那些消息做了一下总结,并加入了自己的看法和预测.一个新的身份标识关于IE11的第一个新闻就是它有了一个新的用户代阅读全文
posted @ 2013-04-18 22:02 紫云飞 阅读(4224) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/03/es6-and-method-definitions.html在JavaScript的对象字面量中,属性值被设置成为一个函数是个很常见的做法.在各种JavaScript框架中,这种做法也很常见,尤其是用来设置构造函数的prototype属性对象的时候.在即将到来的ECMAScript 6中,引入了一种名叫方法定义(method definition)的新语法糖,相对于以前的完整写法,这种简写形式可以让你少写一个function键字.在介绍"方法定义"之前,让我们快速的回顾一下访问器属性.访问器属性是个可阅读全文
posted @ 2013-04-14 00:20 紫云飞 阅读(1012) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/automatic-inlining-in-javascript-engines.html想当年,在JavaScript解释器的运行速度还很慢的时候,有一条最佳实践就是"不要在性能关键(performance-critical)的代码中使用函数调用".随着最近现代JavaScript引擎的不断发展,这条最佳实践变的不是那么必要了.其中,能在很大程度上减少我们对"频繁的函数调用会消耗过多性能"的担心的一个新特性就是自动函数内联(automatic function inlining).阅读全文
posted @ 2013-04-13 11:57 紫云飞 阅读(967) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/css-preload-scanner-in-webkit.html在WebKit中,预加载扫描器指的是一个副解析器,当HTML主解析器被一个同步的script标签阻塞时,预加载扫描器就会启动.然后,它会马上找出接下来即将需要获取的资源(比如样式表,脚本,图片等资源)的URL,然后尽可能早的发起网络请求,而不用等到主解析器恢复运行,从而提高了整体的加载时间.那么,除了HTML文件中的依赖资源,还有样式表中的呢?幸运的是,WebKit已经有了一个叫CSS预加载扫描器的东西了.在WebKit实现符合HTML5标准的解析器的时候阅读全文
posted @ 2013-04-11 18:17 紫云飞 阅读(1161) 评论(0) 编辑
摘要: 原文:http://domenic.me/2013/03/19/strict-mode-static-scoping/现在的确是时候使用JavaScript的严格模式了.之所以这么说,是因为使用严格模式的确能带来很多好处,其中最能说服我(使用严格模式)的一点就是:严格模式可以通过确保脚本的静态作用域来让JavaScript的作用域机制更加合理.简单来说,如果代码的作用域是静态的,那么你就可以通过静态分析来判断出代码中每个标识符真正指向的是哪个值.换句话说,就是静态作用域能够让你知道每个变量是在代码的哪个部位声明的.正如我们下面要讲的,JavaScript的非严格模式不能保证这一点,这就给了我们阅读全文
posted @ 2013-04-10 17:01 紫云飞 阅读(798) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/02/es6-and-object-literal-property-value-shorthand.html使用字面量语法来构建对象是每个JavaScript开发者都非常熟悉的,尤其还因为这种写法和JSON的语法非常相似.在对象子面量中,每个对象属性可以由一个键值对或者由一对getter/setter组成,但这样的写法可能会发生变化.ECMAScript 6中新增的一种语法糖称为对象字面量中的属性值简写(object literal property value shorthand).考虑下面的ECMAScript 5代码片段阅读全文
posted @ 2013-03-01 20:19 紫云飞 阅读(503) 评论(0) 编辑
摘要: 原文:http://www.2ality.com/2013/02/foreach-es6.html本文将对ECMAScript 6中的解构(destructuring)语法做简要介绍,以及讲解一下如何利用解构来让数组方法forEach()的使用更加方便.解构ECMAScript 6中的解构特性具体是指:赋值操作的目标(可以理解为赋值语句的左值)可以是一个模式(pattern),该模式可以进入赋值操作的右值(可以是一个数组或者一个普通对象)的内部,将右值内部的某个数组元素的值(右值为数组的情况)或者某个属性的值(右值为普通对象的情况)赋值给左值模式中包含的某个变量.下面的这个例子演示了解构是如何阅读全文
posted @ 2013-03-01 15:28 紫云飞 阅读(1191) 评论(0) 编辑
摘要: 原文:http://www.2ality.com/2013/02/learn-javascript.html回顾我的编程生涯,有三种编程语言给我学习JavaScript打上了良好的基础(之所以这么说,是因为JavaScript的确有一些比较难学的地方):Scheme: 在我进入大学信息专业的第一学期,我通过经典的“计算机程序的构造和解释”(免费在线阅读)一书学习了Scheme语言.当初,JavaScript从Scheme中学到了闭包[1].最近,受Racket(一种Scheme方言)的启发,ECMAScript 6中又增加了一种称之为private symbol的对象类型来实现“私有性(pri阅读全文
posted @ 2013-02-06 21:20 紫云飞 阅读(966) 评论(1) 编辑
摘要: 首先要说的是,本文是给那些比较"发烧"的火狐玩家看的,其他浏览器用户可能对本文无爱.很多人喜欢使用bookmarklet,放到自己的书签栏里,在点击时对当前页面进行各种各样的操作,比如原文翻译,比如短网址化,比如"分享到","收藏到",等等.和GreaseMonkey脚本的区别就是,这些操作不需要在每次页面加载后都执行,只需要在自己偶尔需要的时候点击执行就可以.bookmarklet是一段由"javascript:"伪协议开头的JavaScript代码,这段代码执行的上下文是当前标签页中的页面窗口(window).阅读全文
posted @ 2013-01-26 16:48 紫云飞 阅读(2626) 评论(4) 编辑
摘要: 我接触过不少语言,我很看重一门语言的正则表达式是否强大,还有正则与语法的结合是否紧密.在这一点上,JavaScript做的还不错,至少有正则字面量.当然,最强大的还是Perl.我最近发现,JavaScript中的正则在某些地方的表现和其他语言或工具中的正则有些不同,比较另类.虽然你几乎不可能写出也几...阅读全文
posted @ 2013-01-15 21:15 紫云飞 阅读(3454) 评论(4) 编辑