我搜索过互联网并找到了一些很好的解决方案,可以将STDOUT发送到2个不同的地方.喜欢日志文件,同时也喜欢屏幕.这是一个例子:
use IO::Tee;
my $log_filename = "log.txt";
my $log_filehandle;
open( $log_filehandle, '>>', $log_filename )
or die("Can't open $log_filename for append: $!");
my $tee = IO::Tee->new( $log_filehandle, \*STDOUT );
select $tee;
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案让STDERR只进入屏幕,我希望STDERR既可以进入屏幕,也可以进入STDOUT记录到的同一个日志文件.这甚至可能吗?
我的任务是记录我的构建过程,但我也想像往常一样在IDE的屏幕上看到它.记录错误消息与记录快乐消息一样重要.将错误记录到单独的日志文件中并不是一个好的解决方案.
我希望能够将日志消息放在bash函数的中间,而不会影响这些函数的输出.例如,请考虑以下功能log()和get_animals():
# print a log a message
log ()
{
echo "Log message: $1"
}
get_animals()
{
log "Fetching animals"
echo "cat dog mouse"
}
values=`get_animals`
echo $values
Run Code Online (Sandbox Code Playgroud)
之后$values包含字符串"Log message: Fetching animals cat dog mouse".
我应该如何修改这个脚本以便"Log message: Fetching animals"输出到终端,并$values包含"cat dog mouse"?
在Stevens的UNIX网络编程中,他提到重定向stdin,stdout和stderr,这在设置守护进程时是必需的.他用以下C代码完成它
/* redirect stdin, stdout, and stderr to /dev/null */
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
Run Code Online (Sandbox Code Playgroud)
我很困惑这三个'知道'他们是如何重定向三个标准*.特别是因为最后两个命令是相同的.有人可以解释或指出我正确的方向吗?
在进行一些Powershell自动化时,我遇到了.cmd自动捕获文件写入stdout的数据的问题.我有两个函数可以执行以下操作:
function a {
& external.cmd # prints "foo"
return "bar"
}
function b {
$val = a
echo $val # prints "foobar", rather than just "bar"
}
Run Code Online (Sandbox Code Playgroud)
基本上,external.cmd发送到stdout的数据被添加到返回值a,即使我真正想要返回的a是我指定的字符串.我怎么能阻止这个?
我有十几个可以通过stdin或选项接受输入的程序,我想以类似的方式为输出实现相同的功能.
optparse代码如下所示:
parser.add_option('-f', '--file',
default='-',
help='Specifies the input file. The default is stdin.')
parser.add_option('-o', '--output',
default='-',
help='Specifies the output file. The default is stdout.')
Run Code Online (Sandbox Code Playgroud)
其余适用的代码如下所示:
if opts.filename == '-':
infile = sys.stdin
else:
infile = open(opts.filename, "r")
if opts.output == '-':
outfile = sys.stdout
else:
outfile = open(opts.output, "w")
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,我喜欢它的简单性 - 但是我无法找到任何使用默认值' - '表示stdout的人的引用.这是一个很好的一致解决方案还是我忽略了更好或更期望的事情?
考虑以下C程序(test.c):
#include <stdio.h>
int main() {
printf("string out 1\n");
fprintf(stderr, "string err 1\n");
getchar();
printf("string out 2\n");
fprintf(stderr, "string err 2\n");
fclose(stdout);
}
Run Code Online (Sandbox Code Playgroud)
哪个应该打印一行到stdout,一行到stderr,然后等待用户输入,然后另一行到stdout,另一行到stderr.非常基本!在编译并在命令行上运行时,程序的输出完成(收到getchar()的用户输入):
$ ./test
string out 1
string err 1
string out 2
string err 2
Run Code Online (Sandbox Code Playgroud)
尝试使用带有以下代码的nodejs将此程序生成为子进程时:
var TEST_EXEC = './test';
var spawn = require('child_process').spawn;
var test = spawn(TEST_EXEC);
test.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
test.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() { …Run Code Online (Sandbox Code Playgroud) 我有一个小Grunt任务,通过节点弹出并运行"composer install".
var done = this.async();
var exec = require('child_process').exec;
var composer = exec(
'php bin/composer.phar install',
function(error, stdout, stderr) {
done(error===null);
}
);
composer.stdout.on(
'data',
grunt.log.write
);
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在将此子进程的stdout输出到grunt.log.除了输出都是我的默认控制台颜色外,所有输出都显示出良好且与预期一致.如果我直接运行"composer install",我会突出显示提高可读性.
由于我是节点的新手,Grunt和一般的炮轰,我不确定系统的哪个部分着色会丢失,甚至不知道如何有效地调试它.
当我想在python中使用某个模型时,我经常使用fit()方法statsmodels.在某些情况下,我编写了一个自动拟合的脚本:
import statsmodels.formula.api as smf
import pandas as pd
df = pd.read_csv('mydata.csv') # contains column x and y
fitted = smf.poisson('y ~ x', df).fit()
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使fit()方法沉默.在我的环境中,它输出一些有关适合标准输出的信息,如:
Optimization terminated successfully.
Current function value: 2.397867
Iterations 11
Run Code Online (Sandbox Code Playgroud)
但我不需要它.我找不到控制标准输出打印的参数.我该如何沉默fit()方法?
Python 3.3.4,IPython 2.0.0,pandas 0.13.1,statsmodels 0.5.0.
为了更好地理解C++中的缓冲流,我想编写一个简单的程序,std::cout在终止之前不刷新缓冲区.由于我已经读取了std::cout在正常终止时刷新,我尝试抛出运行时错误.我也避免使用std::endl,据我所知,强制冲洗.第一次尝试:
//file noflush.cpp
#include <iostream>
int main() {
std::cout << "Don't write me to the console!";
throw 0;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译,从终端调用:
$ ./noflush
libc++abi.dylib: terminating with uncaught exception of type int
Don't write me to the console!Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
即使我强制运行时出错,看起来缓冲区在终止时仍然会被刷新.是否有可能在缓冲区中"绑定"某些数据,使其不被写入设备?
我该如何立即输出stdout?stdout所有输入完成后将打印.
require 'open3'
def run(cmd)
Open3.popen3(cmd) do |stdin, stdout, stderr, thread|
Thread.new do
stdout.each {|l| puts l}
end
Thread.new do
while thread.alive?
stdin.puts $stdin.gets
end
end
thread.join
end
end
run ("ruby file_to_test.rb")
Run Code Online (Sandbox Code Playgroud)
file_to_test.rb:
puts "please, enter s"
puts "please, enter q"
s = gets.chomp!
q = gets.chomp!
puts s
puts q
Run Code Online (Sandbox Code Playgroud)
运行main.rb后的结果是:
somestring
somestring2
please, enter s
please, enter q
somestring
somestring2
Run Code Online (Sandbox Code Playgroud)
我该如何立即输出stdout?
stdout ×10
stdin ×3
logging ×2
node.js ×2
python ×2
redirect ×2
bash ×1
buffer ×1
c ×1
c++ ×1
cout ×1
gruntjs ×1
io ×1
ipython ×1
javascript ×1
optparse ×1
perl ×1
powershell ×1
python-3.x ×1
return-value ×1
ruby ×1
spawn ×1
statsmodels ×1
stderr ×1
stream ×1
unbuffered ×1