- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
POSIX sh(1)
能够进行各种文件描述符操作(等同于 open(2)
、close(2)
和 dup(2)
, etc.) 以及 read
-ing 来自 STDIN 的一行。
所以我的印象是我们可以用符合 POSIX 标准的 shell 脚本替换 cat(1)
,但我还没有想出一个实际的实现。这真的有可能吗?或者,sh(1)
可能缺少 cat(1)
的哪些功能? (暂时忘记 GNU 扩展)
不要问我为什么要这么做。作为智力测验,也许?
最佳答案
cat
可以复制任何文件到标准输出;该文件不需要是文本文件。例如,它可能包含 NUL
,而 NUL
不能在 sh
字符串中表示。所以这肯定是 cat
的一个特性,即使不是不可能,也很难实现。 [注1]
除此之外,您应该能够将 read
和 echo
包装在 while
循环中,尽管存在一些棘手的问题。 (例如,准确再现不以换行符结尾的非空文件。)
但是,从技术上讲,echo
与 cat
一样,都不是 sh
的一部分;就像 cat
一样,它是一个可能不存在的实用程序(在非 Posix 系统上)。实际上,没有 echo
的环境与没有 cat
的环境的可能性差不多;如果您有 sh
,您就有合理的期望找到标准的命令行实用程序。
最小的 Posix 兼容 read
接受的唯一选项是 -r
。但是,如果我们有 read
的 bash 实现,我们可以逐个字符地复制文件,即使 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
该调用中要读取
的完整选项集经过精心设计,以解决 bash 实现中的各种特性:
IFS=
避免从结果中删除尾随空白字符。-n1
导致读取一个字符,直到分隔符为止。直觉上,-N1
会更自然,因为 -N1
会忽略分隔符。但是,read
还会从输入中去除 NUL
字符。如果下一个字符是 NUL
,目的是在 $char
中存储零个字符,我们可以通过使用 -n1
和将分隔符设置为 NUL
,这是有效的,因为分隔符检查是在 NUL
被剥离之前完成的。-d ''
将行分隔符设置为 NUL
。见上文。-r
避免在输入流中解释 \;这是集合中唯一与 Posix 兼容的选项。不用说,以上内容只是理论上的兴趣,或者作为 OP 的智力测验。实际上,shell 脚本应该只做协调外部实用程序的工作,以及存在的 Posix 兼容实用程序,例如 cat
、dd
、head
和 tail
应该足以满足任何文件复制需求。
关于linux - 是否可以用 POSIX sh(1) 复制 cat(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678259/
我正在编写一个应用程序,允许用户创建一个“问卷”,然后向其中添加问题。我正在使用核心数据来存储信息。我创建了一个问卷实体,并与问题实体建立了“一对多”关系。我的问题是,如果要允许用户复制(复制)整个调
有没有办法复制或复制 SharedPreference?或者我需要从一个变量中获取每个变量,然后将它们放入另一个变量中吗? 最佳答案 尝试这样的事情: //sp1 is the shared pref
下面的(A)和(B)有区别吗? (假设 NON ARC,如果重要的话) // --- (A) --- @interface Zoo : NSObject{} @property (copy) Dog
我正在尝试将 mysql SELECT 查询保存到文件中,如下所示: $result = mysqli_query($db,$sql); $out = fopen('tmp/csv.csv', 'w'
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
我在 Source 文件夹中有一个 Active wave 录音 wave-file.wav。我需要使用新名称 wave-file-copy.wav 将此文件复制到 Destination 文件夹。
在使用 GNU Autotools 构建的项目中,我有一个脚本需要通过 make 修改以包含安装路径。这是一个小例子: configure.ac: AC_INIT(foobar, 1.0) AC_PR
我想将 SQL 的行复制到同一个表中。但是在我的表中,我有一个“文本”列。 使用此 SQL: CREATE TEMPORARY TABLE produit2 ENGINE=MEMORY SELECT
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
Hazelcast 是否具有类似于 Ehcache 的复制? http://www.ehcache.org/generated/2.9.0/pdf/Ehcache_Replication_Guide.
我有以下拓扑。一个 Ubuntu 16.04。运行我的全局 MySQL 服务器的 Amazon AWS 上的实例。我想将此服务器用作许多本地主服务器(Windows 机器 MySQL 服务器)的从服务
使用 SQLyog,我正在测试表中是否设置了正确的值。我尝试过 SELECT type_service FROM service WHERE email='test@gmail.com' 因此,只输出
有人可以提供一些关于如何配置 ElasticSearch 进行复制的说明。我在 Windows 中运行 ES,并且了解如果我在同一台服务器上多次运行 bat 文件,则会启动一个单独的 ES 实例,并且
一 点睛 ThreadGroup 复制线程的两个方法。 public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到
一 点睛 ThreadGroup 复制线程组的两个方法。 public int enumerate(ThreadGroup list[]) // 相对于 enumerate(list,true) pu
官方documentation Cassandra 说: Configure the keyspace and create the new datacenter: Use ALTER KEYSPAC
This question already has answers here: How to weight smoothing by arbitrary factor in ggplot2? (2个答
我们有一个表格来表明对各种俱乐部的兴趣。输出将数据记录在 Excel 电子表格中,其中列有他们的首选姓名、姓氏、电子邮件、代词,以及他们感兴趣的俱乐部的相应列中的“1”(下面的模型)。 我们希望为俱乐
This question already has answers here: Closed 8 years ago. Possible Duplicate: In vim, how do I get
如何复制形状及其所在的单元格?当我手动复制时,形状会跟随单元格,但是当我使用宏进行复制时,我会得到除形状之外的所有其他内容。 Cells(sourceRow, sourceColumn).Copy C
我是一名优秀的程序员,十分优秀!