我想处理Ruby中的命令行输入:
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?特别是我想处理空白STDIN,我希望有一个优雅的解决方案.
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
Run Code Online (Sandbox Code Playgroud) 如果我执行以下操作:
import subprocess
from cStringIO import StringIO
subprocess.Popen(['grep','f'],stdout=subprocess.PIPE,stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
我明白了:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 533, in __init__
(p2cread, p2cwrite,
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 830, in _get_handles
p2cread = stdin.fileno()
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
Run Code Online (Sandbox Code Playgroud)
显然,一个cStringIO.StringIO对象不能足够接近文件duck以适应subprocess.Popen.我该如何解决这个问题?
在Perl中,以下代码将从命令行args或stdin中指定的文件中读取:
while (<>) {
print($_);
}
Run Code Online (Sandbox Code Playgroud)
这很方便.我只是想知道在bash中从file或stdin读取的最简单方法是什么.
我对这三个文件的目的感到困惑.如果我的理解是正确的,stdin程序写入其在进程中运行任务的请求stdout的文件是内核写入其输出stderr的文件,并且请求它的进程从中访问信息,并且是文件到输入所有例外情况.在打开这些文件以检查这些文件是否确实发生时,我发现似乎没有任何建议!
我想知道的是这些文件的目的究竟是什么,用非常少的技术术语绝对愚蠢地回答!
有没有办法在bash中有效地做到这一点:
/my/bash/script < echo 'This string will be sent to stdin.'
Run Code Online (Sandbox Code Playgroud)
我知道我可以管道回声的输出,如下所示:
echo 'This string will be piped to stdin.' | /my/bash/script
Run Code Online (Sandbox Code Playgroud) 我正在寻找使用命令行调用处理节点的文本文件,如:
node app.js < input.txt
文件的每一行都需要单独处理,但一旦处理,输入行就会被遗忘.
使用stdin的on-data监听器,我得到一个字节大小的输入蒸汽,所以我设置了它.
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lingeringLine = "";
process.stdin.on('data', function(chunk) {
lines = chunk.split("\n");
lines[0] = lingeringLine + lines[0];
lingeringLine = lines.pop();
lines.forEach(processLine);
});
process.stdin.on('end', function() {
processLine(lingeringLine);
});
Run Code Online (Sandbox Code Playgroud)
但这似乎很草率.必须按线阵列的第一个和最后一个项目.有没有更优雅的方式来做到这一点?
我正试图做相反的事情
我正在运行一个正在更改其输出格式的应用程序,因为它检测到stdout上的管道,我希望它认为它是一个交互式终端,以便在重定向时获得相同的输出.
我当时认为将它包装在expect脚本中或使用proc_open()PHP中的它会这样做,但事实并非如此.
有什么想法吗?
我有一个python脚本parse.py,它在脚本中打开一个文件,比如file1,然后做一些事情可能会打印出总字符数.
filename = 'file1'
f = open(filename, 'r')
content = f.read()
print filename, len(content)
Run Code Online (Sandbox Code Playgroud)
现在,我使用stdout将结果定向到我的输出文件 - 输出
python parse.py >> output
Run Code Online (Sandbox Code Playgroud)
但是,我不想手动执行此文件,有没有办法自动处理每个文件?喜欢
ls | awk '{print}' | python parse.py >> output
Run Code Online (Sandbox Code Playgroud)
那么问题是如何从standardin读取文件名?或者已经有一些内置函数可以轻松完成ls和那些工作?
谢谢!