是否有 POSIX shell 通过使用就地运算符完全消除了对 `cat` 和 `dd` 的需要?

tu-*_*duh 1 shell posix

在 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 实际上是一个解释器,为什么我们没有达到catdd都是多余的地步?

是否有任何基于 POSIX 的 shell 已经完全实现了就地运算符,/dev/cdrom > myfile.iso以至于足以将数据从设备复制到文件?

或者

POSIX 规范中是否有某些内容使这种功能变得不可能?

请注意,此问题与 UUOC 问题略有不同,因为示例仍然使用开头的命令(“<”)而不是就地运算符。所以它仍然符合 first-word-is-a-command 规则。

(顺便说一句,我个人喜欢 dd 因为,如果没有它,说威尔士语会变得不那么有趣。:-p)

Mic*_*mer 5

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

POSIX 要求将命令的第一个单词视为命令名称,并定义该命令必须如何运行

shell 应在单独的实用程序环境中执行实用程序,其操作等同于调用 POSIX.1-2017 的系统接口卷中定义的 execl() 函数,并将路径和 arg0 参数设置为命令名称 [...]

如果 execl() 函数由于与 [ENOEXEC] 错误等效的错误而失败,则外壳 [...] 将写入错误消息并返回退出状态 126。

因此,不允许符合标准的 shell 打开和打印数据文件。然而,没有特别的理由表明 shell 不能作为非 POSIX 扩展支持这种行为。我怀疑您提出的表单有很大的缺点,但 zsh 的版本基本上没问题。