我有一个像这样运行的命令:
$ cmd <file_name> [option]
[option]
是可选的,该命令可以从 stdin
读取。所以下面的命令就可以了:
$ cmd file
$ cmd file option
$ cat file | cmd
但是,使用 [option]
从 stdin
读取会出现错误:
$ cat file | cmd option
Cannot open file: option
那么如何构造命令,或者我必须更改程序以正确从 stdin
读取?
谢谢。
最佳答案
在
bash
中(以及ksh
、zsh
和yash
...等 shell),有 process substitution ,它将管道的输出转换为/dev/fd/
目录中的临时临时文件:cmd <(cat file) option
如R. Sinasohn comments ,类似
/dev/stdin
的东西可能有效:cat file | cmd /dev/stdin option
如果命令依赖于文件可写或具有适当的元数据,这些方法将不会令人满意:
# No editors:
sed -i 's/a/A/' <(echo abcd)
sed: couldn't edit /dev/fd/63: not a regular file
# whatever `file` does won't work.
file <(echo abcd)
/dev/fd/63: broken symbolic link to pipe:[15331948]
# file size not the same as data size.
ls -Hlog <(echo abcd)
prw------- 1 0 Apr 6 23:27 /dev/fd/63
关于linux - 从标准输入或文件读取的命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265622/