我有一个脚本会发出“^ M”字符,并希望用UNIX回车来替换它们。目前,我重定向输出和错误到一个文件中,像这样:动态替换重定向stdout/stderr *中的“^ M”*
bash my_script.sh > my.log 2>&1
我知道,我可以使用tr
进行更换,tr '\r' '\n'
,但我只知道如何与静态文本文件做到这一点,我喜欢在命令结束运行前检查输出日志。我如何使用重定向进行即时更换?
编辑:脚本需要有标准输出和标准错误重定向到日志中。
我有一个脚本会发出“^ M”字符,并希望用UNIX回车来替换它们。目前,我重定向输出和错误到一个文件中,像这样:动态替换重定向stdout/stderr *中的“^ M”*
bash my_script.sh > my.log 2>&1
我知道,我可以使用tr
进行更换,tr '\r' '\n'
,但我只知道如何与静态文本文件做到这一点,我喜欢在命令结束运行前检查输出日志。我如何使用重定向进行即时更换?
编辑:脚本需要有标准输出和标准错误重定向到日志中。
bash my_script.sh |& stdbuf -oL tr '\r' '\n' > my.log
这是我的第一个想法,但这不起作用,日志文件是空的,直到命令完成。 – Guillochon
这是因为缓冲。请参阅:http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe – slim
我不确定是否因为缓冲。当我使用包含'tr'的命令运行时,实际上我再次看到标准输出上的输出。通常,脚本没有发出任何东西(它直接进入日志文件)。 – Guillochon
有短手bash
为piping都stdout
和stderr
为|&
。而只是删除\r
字符与tr
为
bash script.sh |& tr '\r' '\n' > my.log
此外,如果你就可以禁用输出缓冲需要通过做stdbuf -oL
然后在它后面有tr
命令。
与@ slim的答案类似,但这也行不通;日志文件是空的,直到命令完成。我需要随时进行替换,输出仍然在脚本运行时被传送到日志文件。 – Guillochon
@Guillochon:使用'stdbuf'引用我的更新 – Inian
我给了'stdbuf'一个尝试,结果相同:在命令完成之前没有日志输出。 – Guillochon
这里的东西应该为你工作:
bash myscript.sh | sed -u 's/\r/\n/' > my.log 2>&1
这将做替换上飞的命令运行时,仍然写入日志文件。
从sed的手册页:
-u, --unbuffered
load minimal amounts of data from the input files and flush the output buffers more often
你是什么意思与*真正的回车符*? – hek2mgl
@ hek2mgl它们表示UNIX回车。 UNIX == true :) – slim
抛开一个术语:平台中立词条_newline_/_line break_/_line ending_是更好的使用条件; _carriage return_特别指ASCII字符'0xd'(CR,'\ r'),用作_Windows_上CRLF('\ r \ n')序列的一部分。 如果您的输入具有CRLF换行符序列 - 与现在很少使用的CR相反 - 那么您应该简单地删除CR(表示为“^ M”)实例。 – mklement0