有时,我需要指定标准 IO 流 ( stdin, stdout, stderr)之一的“等效路径” 。因为我 99% 的时间都在使用 Linux,所以我只是/dev/在准备 get/dev/stdin等,而这“似乎做对了”。但是,一方面,我一直对这样的理由感到不安(因为,当然,“它似乎有效”,直到它没有为止)。此外,我对这种操作的便携性没有很好的了解。
所以我有几个问题:
在Linux中的情况下,它是安全(是/否)划上等号stdin,
stdout以及stderr用/dev/stdin,/dev/stdout和
/dev/stderr?
更一般地说,这个等价物是否“足够便携”?
我找不到任何 POSIX 参考。
我一直想知道这一点,但从来没有花时间去了解,所以我现在就这样做 -此处显示的/proc/$$/fd/$N或的用法有多便携/dev/fd/$N?我理解POSIX 保证 /dev/null, /dev/tty, and /dev/console (尽管我前几天在阅读了这个答案的评论后才发现这一点)但是其他的呢?
据我所知,它们很常见,但我不能指望在哪些系统中找到它们?为什么不?找到一个比另一个更有可能吗?他们会总是表现出类似的属性吗?
我倾向于以各种方式广泛使用这些设备,我想知道是否有机会尝试一下。
此外,上述问题应该被理解为只是我想我想知道的,但是,因为我显然首先要问,所以我在这方面可能不是最了解的,它们不应该被视为严格的要求一个答案。如果可以,请告诉我。
这个问题及其答案显示现有文件(“processedFile”)的内容可以在其模式之一之前插入到另一个现有文件(“receivingFile”)中,这样:
sed -i -e '/pattern/r processedFile' receivingFile
Run Code Online (Sandbox Code Playgroud)
有时,此类内容可能来自先前的命令单元,并且尚未写入。
那时,是否可以将命令单元的结果插入到receiveFile中而不创建/写入processedFile?
例子:
比如说,我们预处理someFile如下(从第4行开始读取其内容到文件末尾):
awk 'NR>3' someFile
Run Code Online (Sandbox Code Playgroud)
现在,无需将其写入新文件,我们希望将其直接插入到receivingFile中的模式之前,例如:
awk 'NR>3' someFile | <insertion commands>
Run Code Online (Sandbox Code Playgroud)
PS:最好使用awk或sed。
根据@RomanPerekhrest 的请求,
一些文件:
# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
Run Code Online (Sandbox Code Playgroud)
预处理:
awk 'NR>3' someFile:
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 …Run Code Online (Sandbox Code Playgroud)