2012-01-12 82 views
2

我看到很多关于如何删除它们的问题,但是我还没有找到答案,为什么它们在Unix系统和终端中“搞砸”了我所有的测试/打印功能。Unix中打印回车的默认行为是什么?

因此,在程序员的意义上,为什么回车弄乱Unix shell。

编辑:是的,我可以。我不是故意咆哮,但我想知道是什么原因导致回车打印很有趣。

一个示例是从系统获取消息,该消息以\r\n结束所有消息。然后我必须在C中使用message[length - 2] = '\0';或者在perl中使用$str =~ s/\r//g

编辑2:在Unix系统中打印回车的默认行为是什么?它似乎会导致问题,通常需要删除。

+0

你能提供一个具体的例子来说明你用来修复它的代码吗?并问一个关于该代码的问题?这似乎更像是一个咆哮而不是一个问题。 – David 2012-01-12 18:32:49

回答

3

因为它们在Unix系统上是不必要的和不受欢迎的。

你也应该看看你的stty设置。有处理输入和输出NL/CR映射的选项。在Linux中,stty -a说:

speed 9600 baud; rows 65; columns 120; line = 0; 
intr = ^C; quit = ^\; erase = ^?; kill = ^X; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; 
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; 
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 

注意-ocrnlonlcr-onocr-onlret-inlcr-igncr-icrnl尤其如此。

小心他们的混乱。你可以与他们进行试验,如果你保留当前的理智终端设置:

saved_tty_settings=$(stty -g) 

...tinker with the settings here... 

stty $saved_tty_settings 

一个问题可能是因为你解决的事情,这样的回报不再发送到终端。在这种情况下,请尝试输入Control-Jstty $saved_tty_settingsControl-J。第一个控件-J刷新之前的任何命令(或者什么都不做);其余的则运行stty重置操作。我仍然有一个名为sane的脚本,它具有我首选的tty设置的记录,如果必须的话,我可以使用它。在过去的十年中,我并没有经常使用它,但我还没有摆弄tty设置。

请务必谨慎使用危险命令(rm等),甚至使用引号可能会导致问题(如果看不到您输入的内容,并且您失去了跟踪并且禁用了行编辑等, )。所以,你可以玩;只是要小心。

+0

这非常有趣,谢谢。 – Nate 2012-01-12 19:41:18

2

这是因为不同的系统解释不同的字符组合来表示行结束。 Windows使用\r\n,* unix使用\n,Mac使用\r。现在,当您在Unx中获得Windows创建的文本文件时,您会在\n之前获得额外的\r,并且需要将其删除。

有一个很好的工具dos2unix可以为你处理这种格式转换。