如何将stderr和stdout重定向到文件以获取Ruby脚本?
我知道这个语法
var=`myscript.sh`
Run Code Online (Sandbox Code Playgroud)
要么
var=$(myscript.sh)
Run Code Online (Sandbox Code Playgroud)
将捕获结果(stdout)myscript.sh转化为var.我可以重定向stderr到stdout,如果我想同时捕获.如何将它们中的每一个保存为单独的变量?
我在这里的用例是如果返回代码非零,我想要回显stderr并禁止其他方式.可能有其他方法可以做到这一点,但这种方法似乎可行,如果它实际上是可能的.
打印应用程序的"用法"时,是应该在stdout还是stderr上完成?
根据应用程序,我看过几个案例,但似乎没有一个规则.也许我错了,有一个很好的做法.在那种情况下,它是什么?
我正试图以"实时"(当它正在运行时)捕获过程输出.我使用的代码相当简单(见下文).由于某些奇怪的原因,从不调用OutputDataReceived事件.为什么?
private void button2_Click(object sender, EventArgs e)
{
// Setup the process start info
var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1")
{
UseShellExecute = false,
RedirectStandardOutput = true
};
// Setup the process
mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true };
// Register event
mProcess.OutputDataReceived += OnOutputDataReceived;
// Start process
mProcess.Start();
mProcess.WaitForExit();
}
void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
{
//Never gets called...
}
Run Code Online (Sandbox Code Playgroud) 是否有可能在一次运行中将stdout从外部程序重定向到外部程序的变量和stderr到另一个变量?
例如:
$global:ERRORS = @();
$global:PROGERR = @();
function test() {
# Can we redirect errors to $PROGERR here, leaving stdout for $OUTPUT?
$OUTPUT = (& myprogram.exe 'argv[0]', 'argv[1]');
if ( $OUTPUT | select-string -Pattern "foo" ) {
# do stuff
} else {
$global:ERRORS += "test(): oh noes! 'foo' missing!";
}
}
test;
if ( @($global:ERRORS).length -gt 0 ) {
Write-Host "Script specific error occurred";
foreach ( $err in $global:ERRORS ) {
$host.ui.WriteErrorLine("err: $err");
}
} else {
Write-Host …Run Code Online (Sandbox Code Playgroud) 我可以访问一个"好东西"的第三方库.它向stdout发出状态和进度消息.在控制台应用程序中,我可以很好地看到这些消息.在Windows应用程序中,他们只是转到位桶.
有没有一种相当简单的方法将stdout和stderr重定向到文本控件或其他可见的位置.理想情况下,这不需要重新编译第三方代码.它只是在低水平拦截蒸汽.我想要一个解决方案,我只需#include标头,调用初始化函数并链接库,如...
#include "redirectStdFiles.h"
void function(args...)
{
TextControl* text = new TextControl(args...);
initializeRedirectLibrary(text, ...);
printf("Message that will show up in the TextControl\n");
std::cout << "Another message that also shows up in TextControl\n";
}
Run Code Online (Sandbox Code Playgroud)
更好的是,如果它使用了一些我可以覆盖的接口,那么它就不会绑定到任何特定的GUI库.
class StdFilesRedirector
{
public:
writeStdout(std::string const& message) = 0;
writeStderr(std::string const& errorMessage) = 0;
readStdin(std::string &putReadStringHere) = 0;
};
Run Code Online (Sandbox Code Playgroud)
我只是在做梦吗?或者有人知道可以做这样的事情吗?
在两个答案后编辑:我认为使用freopen重定向文件是一个很好的第一步.要获得完整的解决方案,需要创建一个新线程来读取文件并显示输出.对于调试,在cygwin shell窗口中执行'tail -f'就足够了.对于更精美的应用程序...我想写的是什么......创建线程会有一些额外的工作,等等.
我想在Emacs中运行shell命令并将完整输出捕获到变量.有没有办法做到这一点?例如,我想能够设置hello-string于"hello"以下方式:
(setq hello-string (capture-stdout-of-shell-command "/bin/echo hello"))
Run Code Online (Sandbox Code Playgroud)
该函数是否capture-stdout-of-shell-command存在,如果存在,它的真实名称是什么?
对于以下命令:
subprocess.call(shlex.split(
"""/usr/local/itms/bin/iTMSTransporter -m lookupMetadata
-apple_id %s -destination %s"""%(self.apple_id, self.destination))
Run Code Online (Sandbox Code Playgroud)
它将整个输出打印到终端窗口.我如何在这里抑制所有输出?我尝试过subprocess.call(shlex.split(<command> > /dev/null 2&1)),但它没有产生所需的结果.我怎么会这样做?
假设我在C中有以下代码:
double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);
Run Code Online (Sandbox Code Playgroud)
它从stdin变量'var'读取,然后在stdout'var'中打印两次.我理解你是如何从stdin读取双变量的,但我的问题是:
有没有办法在Python 2.x中将二进制输出写入sys.stdout?在Python 3.x中,您可以使用sys.stdout.buffer(或分离stdout等等),但我无法找到任何Python 2.5/2.6的解决方案.
编辑,解决方案:来自ChristopheD的链接,如下:
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Run Code Online (Sandbox Code Playgroud)
编辑:我正在尝试将PDF文件(二进制形式)推送到stdout以便在Web服务器上提供服务.当我尝试使用sys.stdout.write编写文件时,它会将各种回车符添加到二进制流中,导致PDF呈现损坏.
编辑2:对于这个项目,遗憾的是我需要在Windows Server上运行,因此Linux解决方案已经完成.
Simply Dummy示例(从磁盘上的文件读取,而不是动态生成,只是因为我们知道生成代码不是问题):
file = open('C:\\test.pdf','rb')
pdfFile = file.read()
sys.stdout.write(pdfFile)
Run Code Online (Sandbox Code Playgroud)