我的问题很简单,如何将 bash 脚本的所有输出重定向到文件和终端,并从脚本本身中删除颜色字符?
我找不到适合我所有需求的答案。
到目前为止,我尝试tee输出到文件和终端,结合2>&1getstederr和stdout,sed删除颜色字符,所有这些都exec在我的脚本中完成,但它不起作用,我只将彩色日志输入终端,什么也没有在文件中。
#!/usr/bin/env bash
exec 2>&1 | sed -r 's/\x1b\[[0-9;]*m//g' | tee script.logs
python somepython.py
python someotherpython.py
Run Code Online (Sandbox Code Playgroud)
这里 python 脚本产生彩色输出。
我想将它们记录到终端(未触及)和文件中(没有颜色)。实际上,我的 bash 脚本中发生的事情比这两个 python 脚本要多得多,这就是为什么我想全局重定向脚本 bash 的输出,而不仅仅是在每个 python 脚本之后进行管道传输。
因此我使用它是exec因为我认为它允许重定向脚本产生的所有输出。
预先感谢您的任何建议和帮助,
PS:我不想在文件中显示彩色日志,但我不在乎终端中是否需要这样做才能使日志在文件中不被着色。
我有一个“hello world”Windows桌面应用程序,其来源来自这个官方演练。
当我从适用于 Linux 的 Windows 子系统运行此程序时,我得到了预期的行为:shell 阻塞,等待进程退出,并且 shell 提示符仅在进程退出后重新出现。然后我可以检查进程退出代码(此处设置为 3,通过从 中返回wWinMain):
jim@LAPTOP-SMUS1UJN:/mnt/c/Users/james/source/repos/DesktopApp/x64/Release$ ./DesktopApp.exe # blocks until I close the window ...
jim@LAPTOP-SMUS1UJN:/mnt/c/Users/james/source/repos/DesktopApp/x64/Release$ echo $?
3
Run Code Online (Sandbox Code Playgroud)
但是,这不是我从命令提示符或 PowerShell 运行程序时得到的行为。在这里,进程启动了,但是 shell 声称进程立即退出,立即给我一个新的提示!但该进程显然没有退出,因为它创建的窗口仍然存在,我可以与它交互。
在这两种情况下(适用于 Linux 的 Windows 子系统和 PowerShell),进程 stdout 不会打印到终端。(使用 进行验证std::cout << "test",它不会向终端打印任何内容。)
就好像原始进程生成了一个守护进程来运行 win32 的东西。但我不认为这是正在发生的事情,因为 Linux 的 Windows 子系统至少会阻塞直到退出。
当我使用 Visual Studio 创建“控制台”C++ 应用程序时,它的行为符合预期。这种奇怪的提前退出且无输出的行为只发生在我的“桌面”win32 程序中。
那么,为什么命令提示符或 PowerShell 声称进程立即退出呢?它的标准输出在哪里?
我正在尝试重定向在交互式环境中所做的语句的输出mysqlsh。
我在 OSX 上的终端内运行 mysqlsh,但在帮助页面中没有找到合适的参数来实现重新路由。通过默认的“pipe grep > and_run.txt”重新路由输出不起作用,因为 mysqlsh 环境有它自己的一组可接受的命令。
我的命令是:
:$ mysqlsh root@localhost:3306/my_schema
# now the mysqlsh interactive console is open with an active connection to my_schema
mysqlsh> shell.options.set('resultFormat','json')
mysqlsh> session.runSql("SELECT * FROM my_schema.my_table")
# prints the schema as json array - i would like to rerout this output
Run Code Online (Sandbox Code Playgroud) 我有一个程序可以将源文件复制到目标文件。
如果用户只提供 1 个文件或都不提供这些文件,我想使用 stdin 或 stdout。
例如:命令行参数中未提供源文件名,但提供了目标文件名。程序应该从标准输入读取输入并写入给定的目标文件。
我知道,freopen()但我不知道在这种情况下应该如何使用它。
下面是我认为逻辑是如何完成的样板代码,但我找不到任何对我学习有帮助的示例。任何见解都值得赞赏。
char *src = NULL; (unless user provides in preceding code not shown)
char *dest = NULL; (^^)
// open files based on availability
// src and dest not provided, read from stdin and write to stdout
if (src == NULL && dest == NULL) {
FILE *in = freopen(src, "r", stdin);
FILE *out = freopen(dest, "w", stdout);
// TODO
fclose(in);
fclose(out);
// src not provided, read from stdin …Run Code Online (Sandbox Code Playgroud) 在VB6中创建进程时(与此问题相关:),我使用以下结构:
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Run Code Online (Sandbox Code Playgroud)
在开始我的流程之前,为了让我的VB6应用程序读取托管进程的输出,STARTUPINFO.hStdOutput需要做些什么?
谢谢!!
现在,我有一个我正在研究的控制台应用程序,它应该以给定的间隔显示和更新信息到控制台.我遇到的问题是回车时,我一次只能更新一行文本.如果我使用换行符,则无法再使用回车更新旧行.
我能在这做什么?
我的程序中有这个代码
while(1){
// some code here
fprintf(stdout,"Output Log");
fprintf(stderr,"Error Log");
//some code here
}
Run Code Online (Sandbox Code Playgroud)
它只打印"错误日志".看起来我错过了两个fprintf之间的冲洗.因此我将"\n"附加到字符串"输出日志".工作得很好.但当我换掉两个fprintf时,无法理解这种奇怪的行为
while(1){
// some code here
fprintf(stderr,"Error Log\n");
fprintf(stdout,"Output Log");
//some code here
}
Run Code Online (Sandbox Code Playgroud)
尽管使用"\n"它只打印"错误日志".
我正在使用crypto ++库进行一些练习.我期待与从shell调用的sha256sum工具相同的输出.
// typedef unsigned char byte;
byte out[CryptoPP::SHA256::DIGESTSIZE];
byte in=65; // 'A'
CryptoPP::SHA256().CalculateDigest(out, &in, 1);
for(int i=0; i < CryptoPP::SHA256::DIGESTSIZE; i++)
std::cout << std::hex << (int)out[i];
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)
559aead08264d5795d399718cdd5abd49572e84fe55590eef31a88a08fdffd
$ echo A | sha256sum
Run Code Online (Sandbox Code Playgroud)
06f961b802bc46ee168555f066d28f4f0e9afdf3f88174c1ee6f9de004fc30a0
为什么两者不相等?
我试图理解标准流如何在Linux中工作,特别是我可以stdout直接从我的终端捕获说,如尾巴.由于Linux中的所有内容都是文件,是不是可以简单地做一个tail -f /dev/stdout?
所以为了测试这个,我写了一个简单的程序:
int main(int argc, char * argv[]) {
while (1) {
printf("This takes advantage of stdout\n");
sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后在一个单独的终端我做了一个tail -f stdout,但没有打印.难道我做错了什么?
我正在运行单元测试,这可能需要一些时间才能完成,在bash shell中,这些测试在运行时打印输出.我希望打印此输出,并且我还希望将输出存储在变量中.但是,如果可能的话,我希望这些内容可以同时完成,就像tee写入文件时命令一样.也许tee在这种情况下工作......
所以我目前正在这样做:
output=$(ginkgo -r -cover)
echo "$output"
Run Code Online (Sandbox Code Playgroud)
但是,在所有测试运行之前,这显然不会打印单元测试输出.那么如何在测试运行时将输出打印出来,同时将输出存储在变量中呢?