多年来,bzip2 一直是强大压缩的事实上的标准。bzip2到目前为止,我自己已经输入了数千次命令,这让我想知道 - bzip 或 bzip1 发生了什么?谷歌似乎没有告诉我太多关于它的信息,听起来这可能是一堂有趣的历史课。
Brian Kernighan 在此视频中解释了早期贝尔实验室对基于内存限制的小型语言/程序的吸引力
一台大机器将是 64 k 字节——K,而不是 M 或 G——这意味着任何单独的程序都不会很大,所以有一种自然的趋势,即编写小程序,然后是管道机制,基本上是输入输出重定向,可以将一个程序链接到另一个程序。
但考虑到数据必须存储在 RAM 中才能在程序之间传输,我不明白这如何限制内存使用。
来自维基百科:
在大多数类 Unix 系统中,一个管道的所有进程同时启动[强调我的],它们的流适当连接,并由调度程序与机器上运行的所有其他进程一起管理。将 Unix 管道与其他管道实现区分开来的一个重要方面是缓冲的概念:例如,发送程序每秒可能产生 5000 个字节,而接收程序每秒只能接受 100 个字节,但不能数据丢失。相反,发送程序的输出保存在缓冲区中。当接收程序准备好读取数据时,管道中的下一个程序从缓冲区读取。在 Linux 中,缓冲区的大小为 65536 字节 (64KB)。如果需要,可以使用名为 bfr 的开源第三方过滤器来提供更大的缓冲区。
这让我更加困惑,因为这完全违背了小程序的目的(尽管它们在一定程度上是模块化的)。
我唯一能想到的解决我的第一个问题(内存限制有问题取决于大小数据)的唯一方法是,当时根本没有计算大型数据集,而真正的问题管道是要解决的程序本身所需的内存量。但是鉴于维基百科引用中的粗体文本,即使这让我感到困惑:因为一次没有实施一个程序。
如果使用临时文件,所有这些都会很有意义,但我的理解是管道不会写入磁盘(除非使用交换)。
例子:
sed 'simplesubstitution' file | sort | uniq > file2
Run Code Online (Sandbox Code Playgroud)
我很清楚这sed是读取文件并逐行吐出。但是sort,正如 BK 在链接的视频中所说的那样,是一个句号,所以所有的数据都必须被读入内存(或者是吗?),然后它被传递给uniq,这(在我看来)将是一个-一行一次的程序。但是在第一个和第二个管道之间,所有数据都必须在内存中,不是吗?
我无法理解一个奇怪的行为:vi 似乎在文件末尾添加了一个换行符(ASCII:LF,因为它是 Unix ( AIX ) 系统),而我没有专门输入它。
我在 vi 中编辑文件(注意不要在最后输入换行符):
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
Run Code Online (Sandbox Code Playgroud)
我希望 vi 将它“按原样”保存,因此有 39 个字节:前三行(数字 1 到 9,后跟一个换行符(我的系统上为 LF))中的每一行都有 10 个 ASCII 字符,最后一行只有 9 个行(字符 1 到 9,没有终止换行符/LF)。
但是当我保存它时出现它是40个字节(而不是 39 个),并且od 显示一个终止的 LF: …
根据我使用现代编程和脚本语言的经验,我相信大多数程序员通常习惯于将数组的第一个元素以0 表示为索引。
使用1有什么实质性的优势吗?
我确信除了 Zsh 之外,我听说过更多的语言对数组有类似的行为;对我来说很好,因为它同样方便。
但是,由于之前发布并广泛使用的 ksh 和 bash 等 shell 脚本语言都使用 0, 为什么有人会选择更改这个通用的“标准”?
我对我的问题的直接回答是“当然不是”;
那么,我能想到的关于 shell 的这个有点“独特的功能”的唯一解释是“他们这样做只是为了炫耀他们更酷的 shell ”。
不过,我对 Zsh 或其历史知之甚少,而且我关于此的琐碎理论很有可能没有任何意义。
对此有解释吗?还是只是出于个人喜好?
在 Bash 中,可以使用条件表达式比较两个整数
ARG1 OP ARG2
OP是一个
-eq,-ne,-lt,-le,-gt,或-ge。如果arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于arg2,则这些算术二元运算符返回 true 。Arg1和arg2可以是正整数或负整数。
或算术表达式:
<= >= < >比较
== !=平等与不平等
为什么我们有两种不同的方法来比较两个整数?什么时候用哪个?
例如,[[ 3 -lt 2 ]]使用条件表达式,并(( 3 < 2 ))使用算术表达式。当比较为真时两者都返回 0
比较两个整数时,这两种方法可以互换使用吗?如果是,为什么 Bash 有两种方法而不是一种方法?
Unix 何时不再将明文密码存储在 passwd 中?另外,影子文件是什么时候引入的?
看完这个问题为什么选择'~'来代表主目录?,我脑海中的下一个明显问题是为什么“。” '..' 用于表示当前目录和父目录。
现在看起来很直观,但有什么特别的原因吗?
我注意到由 Unix 实用程序格式化的手册页和其他文档通常使用双反引号``后跟双单引号''来包装带引号的短语而不是双引号字符"。单引号同样被替换。为什么是这样?
以下是来自手册页的几个示例grep:
To find all occurrences of the pattern `.Pp' at the beginning of a line:
$ grep '^\.Pp' myfile
The apostrophes ensure the entire expression is evaluated by grep instead
of by the user's shell. The caret `^' matches the null string at the
beginning of a line, and the `\' escapes the `.', which would otherwise match
any character.
The grep utility is compliant with the IEEE Std …Run Code Online (Sandbox Code Playgroud)