在 Vidar Holen 的博客文章Useless Use of dd 中,他认为这dd
实际上是无用的,主要是因为一切都是文件,并且文件可以通过管道传输。
我们还经常在所有 *nix 站点上看到积极劝阻使用cat
.
然而,随后Vidar提出了这个例子:
# Rip a cdrom to a .iso file
cat /dev/cdrom > myfile.iso
Run Code Online (Sandbox Code Playgroud)
...我想知道,是否可以在不使用的cat
情况下做到这一点?
显然,POSIX shell 假设第一组字符是一个命令(因此“[”=“test”等),这在具有就地运算符的现代语言中是不寻常的。而且,作为一个 shell 实际上是一个解释器,为什么我们没有达到cat
和dd
都是多余的地步?
是否有任何基于 POSIX 的 shell 已经完全实现了就地运算符,/dev/cdrom > myfile.iso
以至于足以将数据从设备复制到文件?
或者
POSIX 规范中是否有某些内容使这种功能变得不可能?
请注意,此问题与 UUOC 问题略有不同,因为示例仍然使用开头的命令(“<”)而不是就地运算符。所以它仍然符合 first-word-is-a-command 规则。
(顺便说一句,我个人喜欢 dd 因为,如果没有它,说威尔士语会变得不那么有趣。:-p)
zsh:
</dev/cdrom >myfile.iso
Run Code Online (Sandbox Code Playgroud)
将仅使用运算符(不在sh
仿真中时)执行此操作。不过,它仍在运行$NULLCMD
命令(cat
默认情况下)来进行实际的读取和写入。
您建议的语法
/dev/cdrom > myfile.iso
Run Code Online (Sandbox Code Playgroud)
现在实际上可以在任何 POSIX shell 中工作——因为它根本不涉及 shell。
所需要的/dev/cdrom
是可执行文件,并在执行时输出 CD 的内容。这是您的内核或设备驱动程序可以提供的。或者,系统可以execl
(和朋友)使用/dev/cdrom
或其内容作为启动具有该文件名的另一个可执行文件(例如cat
)的密钥。
在这两种情况下,具有suitably-exec
能/dev/cdrom
你绝对能在任何shell中运行该命令。我不知道有任何系统会以这种方式运行,这可能是有充分理由的,但从理论上讲,这是允许且可能的。
POSIX 要求将命令的第一个单词视为命令名称,并定义该命令必须如何运行:
shell 应在单独的实用程序环境中执行实用程序,其操作等同于调用 POSIX.1-2017 的系统接口卷中定义的 execl() 函数,并将路径和 arg0 参数设置为命令名称 [...]
如果 execl() 函数由于与 [ENOEXEC] 错误等效的错误而失败,则外壳 [...] 将写入错误消息并返回退出状态 126。
因此,不允许符合标准的 shell 打开和打印数据文件。然而,没有特别的理由表明 shell 不能作为非 POSIX 扩展支持这种行为。我怀疑您提出的表单有很大的缺点,但 zsh 的版本基本上没问题。