环境: Ruby\r: 没有这个文件或目录。

12
我有一个 Rails 项目。当我尝试运行任何 rake 任务或 rails 服务器时,它会给我这个错误:

env: ruby\r: 没有那个文件或目录

请问是否有人能帮助我解决这个问题?
7个回答

40

如果您在Unix / Mac上工作,那么这个错误是因为您的行结束符不正确。

这里有一个使用dos2unix的解决方案;您可能需要在系统上安装此程序。如果apt可用,则可以使用sudo apt install dos2unix

    1. 正确设置您的行结束符,并让git管理如何处理它们:
git config --global core.autocrlf input
    1. 在您的目录中,通过运行以下命令,您将会转换所有文件:
    1. 在您的目录中,通过运行以下命令,您将会转换所有文件:
find ./ -type f -exec dos2unix {} \;

这将循环遍历您的所有文件,进行转换并解决问题。添加更改,提交它们,然后您就可以开始了。


14
如果你遇到了"find: ‘dos2unix’: No such file or directory"这个错误,可以执行以下命令进行修复:sudo apt install dos2unix。请注意,翻译只涉及内容的转换,不包括其他任何额外信息。 - RealMan
3
请注意,find命令可能过于冗长。这一点是有争议的;在某些情况下,这样做可能很好,但在某些情况下可能过度使用。另一个可能的方法(对于此答案中的步骤2)是git rm -r --cached .,然后是git reset --hard HEAD,这可能更快(至少不会在.git清理目录中的文件上运行dos2unix!)。这也可能有潜在的陷阱(如果您从"clean" checkout运行,则可能非常好),但我想至少提一下。 - lindes
对于我来说,在Debian上使用以下命令就足够了:sudo dos2unix file.txt - k1000

4
您可能已经编辑了./bin/rake文件,并在第一行末尾添加了\r:
#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
require_relative '../config/boot'
require 'rake'
Rake.application.run

确保在"ruby"之后只有换行符。

第一行末尾没有 \r。 - Igor Babkin
也许不是这个文件的问题,而是你试图通过/usr/bin/env运行“ruby\r”脚本。你必须检查所有具有该指令的文件:#!/usr/bin/env ruby,这可能是来自./bin目录的其他文件。 - Karol Karwacki
问题出在GIT上,我需要设置core.autocrlf = input。 - Igor Babkin
2
"\r" 在您的文字处理软件中通常是不可见的。 - Taryn East
1
@Karol:请停止滥用冒犯性标记。 - Matt

3
感谢以上评论,由于克隆了组内的github rails应用程序导致localhost:3000失败,但是通过这些评论我解决了服务器问题。我只是在从我的全栈应用程序:ruby(-v 2.7.1)/rails(-v 6.0.3.4)后端上工作。这两个人的评论解决了我的问题:
"对于那些遇到“find: ‘dos2unix’: No such file or directory”错误的人:sudo apt install dos2unix" – RealMan Jul 26 '17 at 14:59
“请注意,该find命令可能过于冗长…这一点是有争议的;它很好,但在某些情况下可能过于繁琐。此答案第二步的另一个可能路线是git rm -r --cached然后是git reset --hard HEAD……这可能更快(如果没有其他问题,它不会在.git维护目录中运行dos2unix!)……这也可能有潜在的陷阱(如果您从“干净”的检出中运行,那么这很好),但我至少要提一下。”– lindes Jul 13 '19 at 0:42

2
我一直在遇到这个错误,最终找到了解决方法。
  1. 我确保bin文件夹中的所有文件权限都是可执行的。

在当前存储库中运行 ls -lha 命令。你希望每个文件的结尾都有一个 x,就像这样

-rwxr-xr-x

为此,你需要为bin文件夹中的每个文件运行 chmod +x <file_name_here>,例如 chmod +x railschmod +x bundle等。

现在运行 ls -lha 命令,你应该能看到它们结尾都有一个 x。

  1. 接下来,在SublimeText、Atom或任何文本编辑器中,你需要检查是否使用了Windows换行符。 \r 字符是Windows使用的,Unix只使用 \n 作为新行。

我使用的是Atom,所以我去插件部分(Mac上按下 Cmd + ,),然后在Packages部分搜索 line-ending-selector,然后进入line-ending-selectors设置。将默认值更改为 'LF'。

你会发现在文件底部,Atom会告诉你文件正在使用哪种行结束方式,Windows是 CRLF,Unix/Mac是 LF。你希望所有文件都使用 'LF'。

因此,在终端中,通过运行 atom ./bin/filename(例如 atom ./bin/rake)打开bin文件夹中的每个文件。

在底部,你会看到 'CRLF' 或 'LF'。如果看到 'CRLF',点击它,在Atom顶部可以选择 'LF'。

按下 Cmd + s 保存。

对于每个文件都要这样做。你基本上是告诉文件删除所有Windows换行符,并改用Unix换行符。

编辑完所有文件后,你应该能够运行rake或rails命令。

注意:Sublime Text和Text Mate应该有与Atom的line-ending-selector相当的工具。


2

针对 macOS 用户

步骤1: HOMEBREW_NO_AUTO_UPDATE=1 brew install dos2unix
步骤2: git config --global core.autocrlf input
步骤3: find ./ -type f -exec dos2unix {} \; (在您试图运行任务的 repo 中执行)

git addgit commit
现在您可以开始使用了!


1

我在Windows Terminal上使用WSL 2时遇到了同样的问题!我按照一篇文章的建议安装了dos2unix依赖项:sudo apt install dos2unix(使用apt包管理器),并运行其他两个命令:

  • git config --global core.autocrlf input(设置正确的行尾,并让git管理如何处理它们)

  • find ./ -type f -exec dos2unix {} \;(在您要转换所有文件的目录中)

git将识别出几个更改,但您不需要提交它。我只是做了一个git restore .,删除节点依赖项rm -rf node_modules,再次下载yarn install


0
如果其他答案都无效,请尝试以下方法:
git config --global core.autocrlf true
rails app:update:bin

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