2017-02-22 43 views
1

我有一个脚本会发出“^ M”字符,并希望用UNIX回车来替换它们。目前,我重定向输出和错误到一个文件中,像这样:动态替换重定向stdout/stderr *中的“^ M”*

bash my_script.sh > my.log 2>&1 

我知道,我可以使用tr进行更换,tr '\r' '\n',但我只知道如何与静态文本文件做到这一点,我喜欢在命令结束运行前检查输出日志。我如何使用重定向进行即时更换?

编辑:脚本需要有标准输出标准错误重定向到日志中。

+1

你是什么意思与*真正的回车符*? – hek2mgl

+2

@ hek2mgl它们表示UNIX回车。 UNIX == true :) – slim

+3

抛开一个术语:平台中立词条_newline_/_line break_/_line ending_是更好的使用条件; _carriage return_特别指ASCII字符'0xd'(CR,'\ r'),用作_Windows_上CRLF('\ r \ n')序列的一部分。 如果您的输入具有CRLF换行符序列 - 与现在很少使用的CR相反 - 那么您应该简单地删除CR(表示为“^ M”)实例。 – mklement0

回答

2
bash my_script.sh |& stdbuf -oL tr '\r' '\n' > my.log 
+0

这是我的第一个想法,但这不起作用,日志文件是空的,直到命令完成。 – Guillochon

+0

这是因为缓冲。请参阅:http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe – slim

+0

我不确定是否因为缓冲。当我使用包含'tr'的命令运行时,实际上我再次看到标准输出上的输出。通常,脚本没有发出任何东西(它直接进入日志文件)。 – Guillochon

2

有短手bashpipingstdoutstderr|&。而只是删除\r字符与tr

bash script.sh |& tr '\r' '\n' > my.log 

此外,如果你就可以禁用输出缓冲需要通过做stdbuf -oL然后在它后面有tr命令。

+0

与@ slim的答案类似,但这也行不通;日志文件是空的,直到命令完成。我需要随时进行替换,输出仍然在脚本运行时被传送到日志文件。 – Guillochon

+0

@Guillochon:使用'stdbuf'引用我的更新 – Inian

+0

我给了'stdbuf'一个尝试,结果相同:在命令完成之前没有日志输出。 – Guillochon

2

这里的东西应该为你工作:

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