将stdin模拟为文件

时间:2016-11-28 18:36:10

标签: bash shell stdin

我有一个需要--file xyz.json参数的Python脚本。

事实上,我的JSON是巨大的,因此它是Gzipped。当然我可以解压缩然后运行脚本,但这看起来很浪费。有没有一种聪明的方法可以让我在做zcat xyz.json.gz | myscript.py --file ?????时工作。我不想修改myscript.py来读取stdin而不是文件,除非没有办法完成此操作。

谢谢!

2 个答案:

答案 0 :(得分:4)

尝试:

myscript.py --file <(zcat xyz.json.gz)

返回包含管道的文件描述符。如果脚本只读取文件,并且不向前和向后搜索,这应该可以。

<( ... )被称为process substitution

详细说明会发生什么:

% awk 'BEGIN{print "filename:", ARGV[1]};1'  <(echo first; sleep 1; echo second) 
filename: /proc/self/fd/11
first
second

延迟后会second打印出来。所以:Awk获取文件名/proc/self/fd/11,并开始处理它。它会立即看到第一行,并将其打印出来。然后,在睡眠之后,它将看到第二行,并打印出来。

答案 1 :(得分:2)

您可以使用/dev/stdin或(等效)/dev/fd/0

zcat xyz.json.gz | myscript.py --file /dev/stdin
zcat xyz.json.gz | myscript.py --file /dev/fd/0