是否有官方的 POSIX、GNU 或其他指南来说明应该在何处打印进度报告和日志信息(例如“Doing foo; foo done”)?就个人而言,我倾向于将它们写入 stderr,这样我就可以重定向 stdout 并仅获取程序的实际输出。我最近被告知这不是一个好的做法,因为进度报告实际上并不是错误,只有错误消息应该打印到 stderr。
这两个职位都有意义,当然您可以根据您正在做的事情的细节选择一个或另一个,但我想知道是否有一个普遍接受的标准。我无法在 POSIX、GNU 编码标准或任何其他此类广泛接受的最佳实践列表中找到任何特定规则。
我们有一些类似的问题,但它们没有解决这个确切的问题:
何时在 shell 脚本中使用重定向到 stderr:接受的答案表明我倾向于做什么,将程序的最终输出保留在 stdout 上,并将其他任何内容保留在 stderr 上。然而,这只是作为用户的意见提出的,尽管有论据支持。
使用消息应该转到 stderr 还是 stdout?:这是特定于帮助消息的,但引用了 GNU 编码标准。这就是我正在寻找的东西,不仅限于帮助消息。
那么,对于进度报告和其他信息性消息(不是程序实际输出的一部分)应该在哪里打印,是否有任何官方规则?
我有一个程序可以生成有用的信息,stdout但也可以从stdin. 我想将其标准输出重定向到一个文件,而不在标准输入上提供任何内容。到目前为止,很好:我可以做到:
program > output
Run Code Online (Sandbox Code Playgroud)
并且不要在 tty 中做任何事情。
但是,问题是我想在后台执行此操作。如果我做:
program > output &
Run Code Online (Sandbox Code Playgroud)
程序将被挂起(“挂起(tty 输入)”)。
如果我做:
program < /dev/null > output &
Run Code Online (Sandbox Code Playgroud)
程序立即终止,因为它到达 EOF。
似乎我需要的是将program某些内容导入到无限期不执行任何操作且不读取的内容中stdin。以下方法有效:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Run Code Online (Sandbox Code Playgroud)
然而,这一切都非常难看。有有是一种优雅的方式,使用标准的Unix工具,以“什么都不做,无限期”(意译man true)。我怎么能做到这一点?(我这里优雅的主要标准:没有临时文件;没有忙碌等待或定期唤醒;没有异国情调的实用程序;尽可能短。)
stdout在一台 CentOS 服务器上需要通过管道连接到stdin另一台 CentOS 服务器上。这可能吗?
ScottPack、MikeyB 和 jofel 都有有效的答案。我将答案授予 Scott,因为即使我的问题没有将安全性指定为一项要求,但安全总是好的。不过,其他两位研究员的建议也能奏效。
我想设置我的终端,以便stderr以不同的颜色打印stdout;也许是红色的。这样更容易区分两者。
有没有办法在中配置它.bashrc?如果没有,这甚至可能吗?
注意:这个问题是合并另一个是问stderr,stdout 和用户输入回波是在输出3种不同颜色。答案可能正在解决任何一个问题。
尝试将 Python 脚本中的 stdout 写入文本文件 ( python script.py > log) 时,会在命令启动时创建文本文件,但在 Python 脚本完成之前不会写入实际内容。例如:
脚本.py:
import time
for i in range(10):
print('bla')
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
使用 调用时每 5 秒打印到标准输出python script.py,但是当我调用 时python script.py > log,日志文件的大小保持为零,直到脚本完成。是否可以直接写入日志文件,以便您可以跟踪脚本的进度(例如使用tail)?
编辑事实证明,这样python -u script.py做的技巧,我不知道标准输出的缓冲。
为什么以下命令不会在生成的文件中插入新行,解决方案是什么?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
Run Code Online (Sandbox Code Playgroud) 我想在文件更改时输出文件的内容,例如,如果我有文件foobar并且我这样做:
magic_command foobar
当前终端应该显示文件的内容并等到,我不知道,我按 ^C。
然后,如果从另一个终端我做:
echo asdf >> foobar
除了原始文件内容外,第一个终端应该显示新添加的行(当然,考虑到我没有按 ^C)。
给定一个命令,当它的输出到达终端时改变其行为(例如产生彩色输出),如何在保留改变的行为的同时在管道中重定向该输出?必须有一个实用程序,我不知道。
某些命令(例如grep --color=always)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。
如果重要的话,我的 shellbash在 Linux 上。
我知道cat可以做到这一点,但它的主要目的是连接而不是仅仅显示内容。
我也知道lessand more,但我正在寻找一些简单的(不是寻呼机),它只是将文件的内容输出到终端,并且它是专门为此而制作的,如果有的话。