./configure:/bin/sh^M:解释器错误

452

我一直在尝试在我的Fedora 12系统上安装lpng142。对我来说似乎有问题。我得到了这个错误

[root@localhost lpng142]# ./configure
bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
[root@localhost lpng142]# 

如何解决这个问题?是关于 /etc/fstab 文件的:

#
# /etc/fstab
# Created by anaconda on Wed May 26 18:12:05 2010
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=ce67cf79-22c3-45d4-8374-bd0075617cc8 /boot                   ext4    
defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

3
谢谢,dos2unix救了我的一天。对于苹果系统的用户来说,使用起来越来越容易了。使用brew install dos2unix命令安装dos2unix即可。 - Arejae
6
VIM命令:set fileformat=unix翻译:将文件格式设为UNIX格式。 - PodTech.io
2
问题的年龄通常不是决定重复的因素。一个一般、专注的问题,容易在谷歌中找到,通常比一个模糊、专业化的问题更适合作为重复目标,即使答案相对普遍。 - tripleee
2
@tripleee 不太令人信服,因为任何用户都可以将错误日志复制粘贴到网络搜索中。 - Vineeth Pradhan
3
如果你真的认为这个重复问题应该反过来,那么请在[元]上提出。值得一提的是,“坏的解释器”症状只是可能出现的许多症状之一,而这个问题中关于“configure”和“fstab”的细节会分散注意力。 虽然如果合并问题更容易,我很乐意将这里的一些答案合并到主要的重复问题中去。 - tripleee
显示剩余2条评论
15个回答

871

为了解决问题,请用vi或vim打开你的脚本,并进入vi命令模式(按下键盘上的键),然后输入以下内容:

:set fileformat=unix

最后保存文件

:x!:wq!


3
我有许多文件出现了同样的问题,如何在整个目录树中应用这个方法?我需要逐个进入每个目录,并在vi中打开每个文件,然后输入":set fileformat=unix"吗?请帮忙解决。 - uss
36
:set ff=unix 也可以起作用 :) (翻译解释:这是一个命令行指令,用于将当前文件的文本格式转为 Unix/Linux 系统下的格式,它表示该命令在执行时会生效。) - Kyslik
11
为什么你用感叹号来保存?感叹号只在你想放弃更改时使用,这并不是当前的情况。如果保存失败,那么可能是你做错了什么。 - María Arias de Reyna Domínguez
在我的 vi (rapbian jessie) 上无法工作。 - Pygmalion
非常优雅和有效的解决方案。对我来说运行良好(CE 1.7.0.2,ubuntu,nginx,varnish 3.0,turpentine)。 - DarkCowboy
显示剩余6条评论

384

看起来你有一个dos换行符的文件。提示是^M

你需要使用Unix换行符重新保存该文件。

你可能有一个dos2unix命令行实用程序,也可以为你完成这个任务。


1
是的,^M 看起来有点奇怪。我在网上看到过 dos2unix 配置建议,但不想遇到其他问题。好的,手指交叉,我会尝试一下 :) 感谢 Konerak 和 Richard 的快速回复。 - Vineeth Pradhan
15
如果你正在尝试构建的项目有许多需要转换的脚本(在Qt中是这种情况),递归应用dos2unix可能是一个不错的选择。从最高层目录运行“find . -type f | xargs dos2unix”即可完成。 - Jeff Trull
2
该死的Qt配置文件(在这里从源代码构建)有这些垃圾。叹气真正有用的工具可以节省很多手动劳动。但是考虑到带有“每个地方”名称的ZIP文件中附带库的源代码,为什么还需要这样做呢,这超出了我的理解范围。 - rbaleksandar
11
“dos2unix”修复了它......顺便说一下,如果需要的话,“yum install dos2unix”。 - Sebas
4
非常好!对于Sublime Text 3用户而言,这可以通过选择“视图 -> 行尾 -> Unix”进行修复。 - weezilla
显示剩余2条评论

130

或者如果你想要使用脚本来实现:

sed -i 's/\r//' filename

8
+1,在Debian Linux上对我有用。 - dbjohn
4
这很简单,但仅适用于_GNU_的sed。在BSD/macOS的sed中,您需要使用sed -i'' $'s/\r//' filename(来自bash),或者稍微更健壮一些:sed -i'' $'s/\r$//' filename - mklement0

51

您的配置文件包含CRLF行尾符(Windows风格),而不是简单的LF行尾符(Unix风格)。 您是否使用FTP模式ASCII从Windows传输它?

您可以使用

dos2unix configure

要修复这个问题,或者在vi中打开文件并使用:%s/^M//g;命令替换所有的"^M"(使用CTRL+VCTRL+M来输入 "^M")。


2
不,我确实使用Linux下载了.gz文件。不知道为什么会出现CRLF。 - Vineeth Pradhan
2
更易于输入的vim搜索和替换命令:%s/\r$//g - glenn jackman
1
在某些系统上(例如最近的Debian / Ubuntu),二进制文件被称为fromdos,而不是dos2unix。 - pevik
只是想评论一下,我刚从JPEG网站直接下载了原始的jpeg9-e zip文件,里面有所有的^Ms,导致configure和makefiles无法使用,除非进行转换。错误不在OP这边。IJG的某个人必须编辑了这些文件,但没有注意到它们与Unix不兼容。这在jpeg 8x文件中并不是这种情况。 - user2465201

30
您可以使用以下命令进行修复。
cat file_name.sh | tr -d '\r' > file_name.sh.new

2
这在 MacOS X 10.11 上也可以正常工作。 - loretoparisi

16
如果您无法找到运行命令,请执行以下步骤:

CentOS:

# yum install dos2unix*

# dos2unix filename.sh
dos2unix: converting file filename.sh to Unix format ...

Ubuntu / Debian:

# apt-get install dos2unix

13

当您从Windows编辑文件并尝试从某些基于Unix的机器上执行该文件时,通常会出现此问题。

我在Linux论坛上找到的解决方案对我很有帮助(多次):

perl -i -pe's/\r$//;' <file name here>

希望这可以帮到你。

附注:你需要在你的Unix/Linux机器上安装Perl。


7
感谢pwc101在这篇文章中的评论,这个命令在Kali Linux中有效。
请确保您替换括号{}中的内容。例如,{ctrl+m}表示同时按下Ctrl键和M键。 sed -i s/{ctrl+v}{ctrl+m}// {filename}

6

接下来是关于Richard评论的内容。这里有一种简单的方法将您的文件转换为UNIX行尾。如果您像我一样在Windows记事本中创建了它,然后尝试在Linux中运行它-那是个坏主意。

  1. 下载并安装Notepad++(免费)。
  2. 在Notepad++中打开您的脚本文件。
  3. 文件菜单-> 另存为 ->
  4. 保存类型:Unix脚本文件(*.sh;*.bsh)
  5. 将新的.sh文件复制到您的Linux系统中
  6. 通过以下命令使其可执行:chmod 755 the_script_filename
  7. 使用以下命令运行:./the_script_filename

任何其他问题请尝试访问此链接


3
Notepad++ 中还有一个设置可以设置默认的行尾符号,方法是:在“首选项 -> 新建文档 -> 格式”中选择 Unix。但需要注意的是:这只会影响新文件的默认格式,如果现有文件使用其他格式,它不会改变其格式。 - Matthew Wilcoxson
1
您可以在Notepad++中使用替换功能切换行尾。打开“扩展”搜索模式,输入“\r\n”进行查找,输入“\n”进行替换。点击“全部替换”即可完成操作! - Matthew Wilcoxson
3
在Notepad++中进行修复,只需右键单击右下角的DOS\Windows,然后选择UNIX/OSX格式即可。 - Alaa M.

6

在我的情况下,只需在脚本名称前加上“sh”即可使其工作。


1
非常感谢您发布这篇文章。所有这些dos2unix /行尾修复解决方案都对我无效。最终我通过执行sudo sh ./MyScript.sh来使其运行。在RedHat 6 / RHEL 6上完成。 - velkoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接