Shell 如何在将多个文件管道化到python脚本中时避免EOF错误

Shell 如何在将多个文件管道化到python脚本中时避免EOF错误,shell,python-3.x,pipe,eof,xargs,Shell,Python 3.x,Pipe,Eof,Xargs,我有一个脚本,它将一个或多个文件作为命令行参数,并生成一系列绘图。我希望能够使用这个脚本,这样我就可以找到所有相关的文件,并将它们传输到脚本。因此,我有以下呼吁: find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 python smth.py 到目前为止还不错。。。但问题是,我需要用户提供一些输入,关于要使用哪些列(希望脚本灵活),以及稍后如何命名输出图形 在第一次调用in

我有一个脚本,它将一个或多个文件作为命令行参数,并生成一系列绘图。我希望能够使用这个脚本,这样我就可以找到所有相关的文件,并将它们传输到脚本。因此,我有以下呼吁:

find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 python smth.py
到目前为止还不错。。。但问题是,我需要用户提供一些输入,关于要使用哪些列(希望脚本灵活),以及稍后如何命名输出图形

在第一次调用
input()
时,当我读取一行时,它就会断开。我知道使用管道将不同程序的stdin和stdout相互绑定,因此在脚本中调用
input()
读取stdin是行不通的

我该如何处理这个问题?我想到了从用户那里获取输入的其他方法,比如在运行时提交一个配置文件,但我不喜欢这种解决方案,因为为每次运行准备配置文件有点拖拉。应该有一个更简单的方法来解决这个问题


建议

你能分步做吗?如下所示:

步骤1-找到数据并将其存储在临时文件中

 find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z >> output.out
第2步-根据用户输入,使用python脚本执行任何您想要的操作

python smth.py < output.out
python smth.py

在python脚本中,将output.out中的数据保存到一个临时变量中,以根据用户输入进行操作。

在我的系统中,man xargs专门针对以下内容提出了
-o
选项:

-o在执行之前,在子进程中以/dev/tty的形式重新打开stdin 命令。如果希望xargs运行交互式应用程序,这非常有用

这意味着您只需使用:

find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 -o python smth.py
参考提供了一些关于问题发生原因的见解。简而言之,默认情况下,
xargs
将stdin指向
/dev/null
,因为它不知道应该是什么。虽然在BSD xargs上有一个很好的解决这个问题的方法(通过提供
-o
标志),但GNU的研究员发现,
echo foo bar | xargs sh-c'emacs“$@”
是一个更好的方法

在这种情况下,它最终看起来像这样:

find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 bash -c '</dev/tty python myscript.py "$@"' ignoreme

find$PWD/somedir/-path'*\u d0/final/*'-name'somefile.gz'-print0 | sort-z | xargs-0 bash-c'将管道的输出临时存储到一个文件中,然后作为第二个命令运行python脚本,请求用户输入并从存储的输出中读取选择性值如何?@FurhanS。不确定您的意思,您能详细说明一下吗?所以您建议创建一个文件,其中包含一个文件列表,然后用作python脚本的输入?
@posdef是什么意思。如果可以的话,将内容写入文件。替换了您拥有的哪个版本的xargs?我在mac上有此选项,但在我通过ssh连接到的远程服务器上没有。。这有点奇怪,因为Ubuntu服务器上的版本是从2016年开始的(GNU findutils 4.7.0)