标签: stdout

从内部删除 bash 脚本的颜色并重定向输出

我的问题很简单,如何将 bash 脚本的所有输出重定向到文件和终端,并脚本本身中删除颜色字符?

我找不到适合我所有需求的答案。

到目前为止,我尝试tee输出到文件和终端,结合2>&1getstederrstdoutsed删除颜色字符,所有这些都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:我不想在文件中显示彩色日志,但我不在乎终端中是否需要这样做才能使日志在文件中不被着色。

bash stdout stderr

1
推荐指数
1
解决办法
3056
查看次数

为什么我的 Windows 桌面进程似乎立即退出且没有标准输出?

我有一个“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 声称进程立即退出呢?它的标准输出在哪里?

c++ windows powershell winapi stdout

1
推荐指数
1
解决办法
402
查看次数

重定向mysqlsh交互环境的输出

我正在尝试重定向在交互式环境中所做的语句的输出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)

mysql stdout

1
推荐指数
1
解决办法
916
查看次数

如果 C 中没有给出文件,则使用 stdin 和 stdout

我有一个程序可以将源文件复制到目标文件。

如果用户只提供 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)

c stdin stdout file-handling

1
推荐指数
1
解决办法
822
查看次数

如何在VB6中读取子进程的标准输出?

在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需要做些什么?

谢谢!!

vb6 winapi stdout

0
推荐指数
1
解决办法
2216
查看次数

是否可以使用像CR这样的东西一次刷新两行文本?(C++)

现在,我有一个我正在研究的控制台应用程序,它应该以给定的间隔显示和更新信息到控制台.我遇到的问题是回车时,我一次只能更新一行文本.如果我使用换行符,则无法再使用回车更新旧行.

我能在这做什么?

c++ console printf cout stdout

0
推荐指数
1
解决办法
129
查看次数

stderr的怪异行为

我的程序中有这个代码

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"它只打印"错误日志".

c c++ stdout stderr

0
推荐指数
1
解决办法
106
查看次数

为什么我没有让sha256正确?

我正在使用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

为什么两者不相等?

c++ hash stdout sha256 gnu-coreutils

0
推荐指数
2
解决办法
541
查看次数

如何尾标节或任何标准流?

我试图理解标准流如何在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,但没有打印.难道我做错了什么?

c linux terminal file-io stdout

0
推荐指数
1
解决办法
6665
查看次数

存储在变量中时打印命令输出

我正在运行单元测试,这可能需要一些时间才能完成,在bash shell中,这些测试在运行时打印输出.我希望打印此输出,并且我还希望将输出存储在变量中.但是,如果可能的话,我希望这些内容可以同时完成,就像tee写入文件时命令一样.也许tee在这种情况下工作......

所以我目前正在这样做:

output=$(ginkgo -r -cover)
echo "$output"
Run Code Online (Sandbox Code Playgroud)

但是,在所有测试运行之前,这显然不会打印单元测试输出.那么如何在测试运行时将输出打印出来,同时将输出存储在变量中呢?

bash stdout tee io-redirection

0
推荐指数
1
解决办法
202
查看次数