是否可以使用POSIX sh(1)复制cat(1)?

野田会

POSIXsh(1)是能够有各种文件描述符操作(相当于open(2)close(2)dup(2)),以及read-ing从STDIN单行。

因此,我给我们留下了可以替换cat(1)为符合POSIX的shell脚本的印象,但是我还没有提出实际的实现方案。真的有可能,或者,cat(1)缺少什么功能sh(1)(暂时忘记GNU扩展)

不要问我为什么要这么做。作为智力测验,也许吗?

cat可以将任何文件复制到标准输出;该文件不必是文本文件。NUL例如,它可能包含s,并且NUL不能在sh字符串中表示因此,这绝对是其中的一个特征cat,即使不是不可能,也将很难实现。[注1]

除此之外,尽管存在一些棘手的问题,您还应该能够将readand包裹echo在一个while循环中。(例如,准确地再现不以换行符结尾的非空文件。)

但是,从技术上讲,它echo只是一部分sh而已cat就像一样cat,它是一个可能不存在的实用程序(在非Posix系统上)。实际上,没有echo的环境与没有的环境的可能性差不多cat如果您有sh,则可以合理地期望找到标准的命令行实用程序。


笔记

  1. 兼容Posix的最低版本唯一接受的选项read-r但是,如果我们使用的bash实现read,则即使NUL字符永远不会真正出现在shell变量,我们也可以逐字符复制文件

    while IFS= read -d '' -rn1 char; do
      if [ -z "$char" ]; then printf '\0'; else printf '%s' "$char"; fi
    done < "$1" > "$2"
    

    例子:

    $ printf 'foo\0bar\n\nbye' |
    > while IFS= read -d '' -rn1 char; do
    >   if [ -z "$char" ]; then printf '\0'; else printf '%s' "$char"; fi
    > done |
    > hd
    00000000  66 6f 6f 00 62 61 72 0a  0a 62 79 65              |foo.bar..bye|
    0000000c
    

    read精心设计了该调用中的完整选项集,以解决bash实现中的各种特质:

    • IFS= 避免从结果中删除结尾的空白字符。
    • -n1导致读取一个字符,直到定界符为止。直观地讲,-N1会自然而然,因为-N1忽略了定界符。但是,read也会NUL从输入中去除字符。由于$char如果下一个字符是a NUL目的是要存储零个字符,我们可以通过使用-n1并将定界符设置为来避免该问题,NUL因为分隔符检查是在NULs剥离之前完成,因此可以避免该问题
    • -d ''将行定界符设置为NUL看上面。
    • -r避免\在输入流被解释;这是该集中唯一的Posix兼容选项。
       

    毋庸置疑,以上内容仅是理论上的考虑,或者根据OP进行智力测验。在实践中,一个shell脚本应该做的不超过协调外部公用设施的工作,并符合POSIX标准的实用程序,如存在catddheadtail应足以满足任何文件复制需求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以使用Google Maps v1?

是否可以使用类型正确复制类

是否可以使用ant ftp任务复制空目录

posix sh:是否可以在不使用外部工具的情况下遍历字符串?

如何验证输入2是否可以使用Java使用输入1中的单词来构造?

是否可以使用float16使用tensorflow 1进行训练?

检查 str1 是否可以使用 JavaScript 重新排列为 str2

在C#中是否可以使用具有1种以上返回类型的函数?

是否可以使用熊猫创建用户定义频率高于 1Hz 的日期范围?

ASN.1:是否可以使用 SIZE 约束来约束 SEQUENCE(而不是 SEQUENCE OF)

是否可以使用多个构造函数来创建1个新实例?

是否可以使用 2 个工厂函数来填充 1 个实例?

NetLogo:在乌龟上下文中,是否可以使用某种语法代替“ crt 1”?

是否可以使用MSAL获得Azure AD V1令牌?

是否可以使用此链接(https://www.instagram.com/ [用户名] /?__ a = 1)

是否可以使用G1ANT Studio自动执行Outlook?

是否可以使用python每1us激活一个线程?

是否可以使用1D索引访问C ++ 2D int数组?

是否可以使用Cat鱼在文本文件中搜索文本?

zsh是否尊重shebang bin / sh以便可以使用破折号?

为什么可以使用setTimeout(“ 1”)

是否可以使用`std :: copy`将值从可变大小的数组复制到容器?

是否可以使用基本的Unix命令复制(而不是克隆)git存储库?

是否可以使用#N / A复制/粘贴所有行而无需过滤列?

是否可以使用Epplus在Excel中复制行(带有数据,合并,样式)?

是否可以使用ISO交换内部HD(与OS)或通过/ dev / sdb进行位复制?

是否可以使用 Azure 数据工厂将 GeoJson 数据复制到 PostGIS 中?

是否可以使用python复制单元格的Excel公式而不是值?

创建对象时,是否可以使用“默认”属性在猫鼬模式中复制对象属性?