由于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 –y install dos2unix

源码包的安装,下载dos2unix源码包安装包dos2unix-3.1.tar.bz2.

下载地址:http://download.chinaunix.net/download/0003000/2360.shtml

#tar–xvf  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”

Ubuntu安装dos2unix工具(转)

[日期: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)做一些优化
由于习惯了unix2dosdos2unix的命令,可以把上面安装的两个工具链接成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: 没有那个文件或目录这个错了。