由于Linux和Windows文本文件的行结束标志不同。在Linux中,文本文件用"\n"表示回车换行,而Windows用"\r\n"表示回车换行。所以在Linux中使用Windows的文本文件常常会出现错误:
/bin/sh^M: bad interpreter:没有那个文件或目录解决。
为了避免这种错误,Linux提供了两种文本格式相互转化的命令:
dos2unix与unix2dos:
dos2unix 把"\r\n"转化成"\n",
unixtodos把"\n"转化成"\r\n"。
命令dos2unix和unix2dos的使用非常简单,格式为:
#dos2unix file-name
1、dos2unix命令的安装
如果你的系统中没有这个命令,就需要你进行该命令软件包的安装。安装你可以选择rpm安装、源码包的安装。
# yum �Cy install dos2unix
源码包的安装,下载dos2unix源码包安装包dos2unix-3.1.tar.bz2.
下载地址:http://download.chinaunix.net/download/0003000/2360.shtml
#tar�Cxvf dos2unix-3.1.tar.bz2
#cddos2unix-3.1.
# make
#make install
安装完dos2unix便可以使用了。
2、解决 ^M的方发:
方法一、
vim filename
进入命令模式下,然后输入命令
:set ff? #可以看到dos或unix的字样. 如果的确是dos格式的。
然后用
:set ff=unix #把它强制为unix格式的, 然后存盘退出。
再次运行脚本。
:set ff=dos #把unix格式改变为dos格式。
方法二、
使用dos2unix命令转一下,即输入:
#dos2unix file-name
上面的命令会去掉行尾的^M。
方法三、
. 使用vi命令的替换功能。进入命令模式,输入以下命令:
:%s/^M$//g # 去掉行尾的^M。
:%s/^M//g# 去掉所有的^M。
:%s/^M/[ctrl-v]+[enter]/g# 将^M替换成回车。
:%s/^M//r/g# 将^M替换成回车。
方法四:
.使用sed命令。和vi的用法相似:
#sed -e ’s/^M//n/g’ myfile.txt
注意:这里的“^M”要使用“CTRL-VCTRL-M”生成,而不是直接键入“^M”。
[日期:2010-11-02] |
来源:Linux社区作者:Linux |
[字体:大中小] |
Ubuntu下默认没有安装dos2unix工具,而且也没有一个叫这个名字的工具(我在solaris里用过dos2unix,不知道为啥Ubuntu没有)。但是有一个替代工具――tofrodos , 下面就说一下它的安装和使用。
当然还是apt安装啦。
(1)安装tofrodos
sudo apt-get install tofrodos
实际上它安装了两个工具:todos(相当于unix2dos),和fromdos(相当于dos2unix)
安装完即可,现在你已经可以进行文本格式的转换啦。
比如: todosHello.txt (即unix2dos Hello.txt)
fromdos Hello.txt (即dos2unix Hello.txt)
(2)做一些优化
由于习惯了unix2dos和dos2unix的命令,可以把上面安装的两个工具链接成unix2dos 和dos2unix,或者仅仅是起个别名,并放在启动脚本里。
步骤:
ln -s /usr/bin/todos /usr/bin/unix2dos
ln -s /usr/bin/fromdos /usr/bin/dos2unix
或者在~/.bashrc里起个别名
vi ~/.bashrc
添加 aliasunix2dos=todos alias dos2unix=fromdos
使用示例示例一 DOS格式文本文件在Linux下的表现
现在有一个脚本文件job.sh,是在Linux下用vi编辑的。
[root@jfht ~]# cat job.sh
#!/bin/sh
date >job.txt
现在把它转换成DOS格式文本文件。
[root@jfht ~]# unix2dos job.sh
unix2dos: converting file job.sh to DOS format ...
尝试着运行一下。
[root@jfht ~]# ./job.sh
-bash: ./job.sh: 权限不够
[root@jfht ~]# chmod +x job.sh
[root@jfht ~]# ./job.sh
-bash:./job.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录
DOS格式的脚本文件时无法解释执行的,因为脚本文件的第一行是用来指定解释器的,Linux系统认为解释器是/bin/sh^M,而不是/bin/sh。
我们来通过Linux下的一些命令来看一下DOS格式文件的真面目。
[root@jfht ~]# cat -v job.sh<== cat-v可以看到文件中的非打印字符,而不带-v参数的cat命令不行。
#!/bin/sh^M
^M
date >job.txt^M
^M
[root@jfht ~]# hexdump -C job.sh<==hexdump -C可以看到文件每个字节的十六进制表示。
00000000 23 21 2f 62 69 6e 2f 73 68 0d 0a0d 0a 6461 74 |#!/bin/sh....dat|
00000010 65 20 3e 6a 6f 62 2e 74 78 74 0d0a 0d 0a |e>job.txt....|
0000001e
[root@jfht ~]# vi job.sh<== 使用vi打开时可以看到底下有[dos]的格式提示。有些版本vi显示的是行尾为^M。
#!/bin/sh
date >job.sh
"job.sh" [dos] 4L, 30C
现在我们把DOS格式改回Unix格式的,看看效果。
root@jfht ~]# dos2unix job.sh
dos2unix: converting file job.sh to UNIX format ...
[root@jfht ~]# ./job.sh
可以执行了,不再报“-bash:./job.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录”这个错了。