我们在第六章里面谈到cat这个指令时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可以利用 cat -A 来观察以 DOS (Windows 系统) 创建的文件的特殊格式, 也可以发现在 DOS 使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 下面,则是仅有 LF ($) 这个断行符号。这个断行符号对于 Linux 的影响很大喔! 为什么呢?
我们说过,在 Linux 下面的指令在开始执行时,他的判断依据是 “Enter”,而 Linux 的 Enter 为 LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序文件,呵呵~将可能造成“程序无法执行”的状态~ 因为他会误判程序所下达的指令内容啊!这很伤脑筋吧!
那怎么办啊?很简单啊,将格式转换成为 Linux 即可啊!“废话”,这当然大家都知道,但是, 要以 vi 进入该文件,然后一个一个删除每一列的 CR 吗?当然没有这么没人性啦! 我们可以通过简单的指令来进行格式的转换啊!
不过,由于我们要操作的指令默认并没有安装,鸟哥也无法预期你有没有网络,因此假设你没有网络的状况下, 请拿出你的原版光盘,放到光驱里头去,然后使用下面的方式来安装我们所需要的这个软件喔!
[dmtsai@study ~]$ su - # 安装软件一定要是 root 的权限才行!
[root@study ~]# mount /dev/sr0 /mnt
[root@study ~]# rpm -ivh /mnt/Packages/dos2unix-*
warning: /mnt/Packages/dos2unix-6.0.3-4.el7.x86_64.rpm: Header V3 RSA/SHA256 ....
Preparing... ################################# [100%]
Updating / installing...
1:dos2unix-6.0.3-4.el7 ################################# [100%]
[root@study ~]# umount /mnt
[root@study ~]# exit
那就开始来玩一玩这个字符转换吧!
[dmtsai@study ~]$ dos2unix [-kn] file [newfile]
[dmtsai@study ~]$ unix2dos [-kn] file [newfile]
选项与参数:
-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new
范例一:将 /etc/man_db.conf 重新复制到 /tmp/vitest/ 下面,并将其修改成为 dos 断行
[dmtsai@study ~]# cd /tmp/vitest
[dmtsai@study vitest]$ cp -a /etc/man_db.conf .
[dmtsai@study vitest]$ ll man_db.conf
-rw-r--r--. 1 root root 5171 Jun 10 2014 man_db.conf
[dmtsai@study vitest]$ unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ...
# 屏幕会显示上述的讯息,说明断行转为 DOS 格式了!
[dmtsai@study vitest]$ ll man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10 2014 man_db.conf
# 断行字符多了 ^M ,所以容量增加了!
范例二:将上述的 man_db.conf 转成 Linux 断行字符,并保留旧文件,新文件放于 man_db.conf.linux
[dmtsai@study vitest]$ dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[dmtsai@study vitest]$ ll man_db.conf*
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10 2014 man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5171 Jun 10 2014 man_db.conf.linux
[dmtsai@study vitest]$ file man_db.conf*
man_db.conf: ASCII text, with CRLF line terminators # 很清楚说明是 CRLF 断行!
man_db.conf.linux: ASCII text
因为断行字符以及 DOS 与 Linux 操作系统下面一些字符的定义不同,因此, 不建议你在 Windows 系统当中将文件编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果你在不同的系统之间复制一些纯文本时,千万记得要使用 unix2dos 或 dos2unix 来转换一下断行格式啊!