我不认为历史Unix 中的 shell/实用程序或像4.4BSD那样“最近”的东西支持使用双破折号(或两个连续的连字符)作为选项分隔符的结尾。使用FreeBSD,您可以看到例如在2.2.1 版本(1997)的rm 联机帮助页中引入的注释。但这只是一个命令的文档。
查看我能找到的最古老的GNU fileutils 更改日志,我看到了这个1(略有改动):
Tue Aug 28 18:05:24 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
* touch.c (main): Don't interpret first non-option arg as a <---
time if `--' is given (POSIX-required kludge).
* touch.c: Add long-named options.
* Many files: Include <getopt.h> instead of "getopt.h" since
getopt.h will be in the GNU /usr/include.
* install.c: Declare some …Run Code Online (Sandbox Code Playgroud) 这个问题的目的是回答好奇心,而不是解决特定的计算问题。问题是:为什么 POSIX 强制实用程序通常不内置到 shell 实现中?
例如,我有一个脚本,它基本上读取一些小文本文件并检查它们的格式是否正确,但由于大量的字符串操作,在我的机器上运行需要 27 秒。这种字符串操作通过调用各种实用程序来创建数千个新进程,因此速度很慢。我非常有信心,如果内置了一些实用程序,即grep, sed, cut,tr和expr,那么脚本将在一秒或更短的时间内运行(根据我在 C 中的经验)。
似乎在很多情况下,构建这些实用程序会影响 shell 脚本中的解决方案是否具有可接受的性能。
显然,选择不内置这些实用程序是有原因的。也许在系统级别拥有一个实用程序版本可以避免该实用程序的多个不同版本被各种 shell 使用。我真的想不出还有很多其他原因来保持创建这么多新进程的开销,而且 POSIX 对实用程序的定义足够多,以至于有不同的实现似乎不是什么大问题,只要它们都是 POSIX合规。至少没有像拥有这么多流程的低效率那样大的问题。
我知道我可以
$ [ -w /home/durrantm ] && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
或者
$ test -w /home/durrantm && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
或者
$ [[ -w /home/durrantm ]] && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
我喜欢使用第三种语法。它们在所有方面以及所有负面和边缘情况下都等效吗?可移植性是否有任何差异,例如 Ubuntu 上的 bash 和 OS X 上的 bash 或较旧/较新的 bash 版本,例如 4.0 之前/之后,它们是否都以相同的方式扩展表达式?
一些 shell,如bash,支持进程替换,这是一种将进程输出呈现为文件的方法,如下所示:
$ diff <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)
但是,此构造不是POSIX,因此不可移植。如何处理替代的实现POSIX -友好的方式(即其中一个在工作/bin/sh)?
注意:问题不是问如何区分两个排序的文件——这只是一个人为的例子来演示进程替换!
我注意到一些应用程序将它们的配置文件放在其中,~/.config/appname而其他应用程序为此使用~/.appname(经典方式,AFAIK)。这种区别有什么意义,我的应用程序可以更好地考虑什么?
更新:看起来我的(XUbuntu 11.10 默认)$XDG_CONFIG_HOME 设置为~/并且我系统中的大多数应用程序(如 Mozilla Firefox、Adobe Flash Player、Midnight Commander、Opera、Wine 等)都符合这一点。但仍有许多应用程序(如 Compiz、Deadbeef、VLC、Qt Creator、Google Chrome、XFCE 等)在使用~/.config/。另一个可疑的事情是目录~/.config/本身不是隐藏的(它们的名称中没有点) - 应用程序配置目录是否不希望在不依赖于位置($XDG_CONFIG_HOME 值)的情况下具有恒定的自己的名称?
使用诸如 and 之类的难以理解的系统调用名称time而creat不是getCurrentTimeSecsand的原因是什么?createFile or 之,也许更适合 Unixget_current_time_secs和create_file. 这让我想到下一点:为什么有人想要cfsetospeed没有驼峰式大小写或至少下划线之类的东西以使其可读?当然,调用会有更多字符,但我们都知道代码的可读性更重要,对吗?
我想确切地了解什么是用户空间?我问的每个人都说:“任何不是内核的东西”。但这对我来说不是有形的。当我读到内核可以在用户空间或类似的东西上运行该驱动程序时;我无法想象会发生什么!。因此,如果有人在这方面让我直截了当,我将不胜感激。
是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?
我想重写sh与bash某些命令。
假设我有一个 POSIX shell 脚本
如何以最通用的方式检测小数点分隔符?
许多人使用 oneliners 和包含沿线代码的脚本
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
Run Code Online (Sandbox Code Playgroud)
第一个cat通常被称为“对 cat 的无用使用”,因为从技术上讲,它需要启动一个新进程(通常/usr/bin/cat),如果命令已被执行,则可以避免这种情况。
< "$MYFILE" command1 | command2 > "$OUTPUT"
Run Code Online (Sandbox Code Playgroud)
因为然后 shell 只需要启动command1并简单地将其stdin指向给定的文件。
为什么 shell 不自动进行这种转换?我觉得“useless use of cat”语法更容易阅读,shell 应该有足够的信息来自动摆脱无用的 cat。的cat是在POSIX标准定义,因此壳应该允许执行它在内部,而不是在路径使用二进制的。shell 甚至可以只包含一个参数版本的实现,并回退到路径中的二进制文件。
posix ×10
shell ×4
shell-script ×3
history ×2
arguments ×1
bash ×1
dot-files ×1
freedesktop ×1
gnu ×1
home ×1
kernel ×1
locale ×1
performance ×1
pipe ×1
portability ×1
system-calls ×1
test ×1
utilities ×1