【问题标题】:'\r': command not found - .bashrc / .bash_profile [duplicate]'\r':找不到命令 - .bashrc / .bash_profile [重复]
【发布时间】:2022-01-10 12:36:26
【问题描述】:

我有 Windows,使用 Cygwin,试图通过我的 .bashrc 文件永久设置 JAVA_HOME

.bashrc:

export PATH="$JAVA_HOME/bin:$PATH"  
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"

.bash_profile:

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

运行 cygwin:

-bash: $'\377\376if': command not found
-bash: $'then\r': command not found
: No such file or directorysu//.bashrc
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi'
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi'

我不确定我是否从适用于其他系统的教程中获取命令,或者我是否缺少步骤。或者空格导致我的命令无法正常运行。

我查看了多个类似的问题,但我没有找到一个问题与我的错误完全一致。


我的家路:

$ echo $HOME
/cygdrive/c/Users/jhsu
$ echo ~
/cygdrive/c/Users/jhsu/

所以我认为文件应该放在正确的位置。

【问题讨论】:

  • echo ~ 给了什么?
  • $ echo ~ /cygdrive/c/Users/jhsu/
  • 这个问题不是 cygwin 特有的——如果在 DOS 机器上创建脚本并执行二进制传输到 Linux 系统并在那里运行,也会发生同样的问题;我已经从标题中删除了 cygwin 引用,因此在其他情况下遇到此问题的人更有可能认真对待这个问题(及其非 Cygwin 特定的答案)。
  • 关于这个问题的背景,特别是在 Cygwin 的上下文中,似乎是在 2007 年左右 Cygwin 开始以 Unix 样式处理回车 - 请参阅 neuron.yale.edu/phpBB/viewtopic.php?t=878。该论坛帖子解释了以下几个答案中讨论的 igncr shell 选项。
  • 在命令行上,export SHELLOPTS 然后set -o igncr 为我运行了配置脚本

标签: bash shell cygwin newline


【解决方案1】:

当 Cygwin 中所有其他方法都失败时...

尝试对相关文件运行dos2unix 命令。

当您看到如下错误消息时可能会有所帮助:

-bash: '\r': command not found

Windows 样式的换行符可能会导致 Cygwin 出现问题。

dos2unix 命令修改换行符,使其与 Unix / Cygwin 兼容。

注意: dos2unix 命令会就地修改文件,因此如有必要,请采取预防措施。

如果需要保留原文件,请先备份。

Mac 用户注意事项:dos2unix 命令在 Mac OS X 上不存在。

查看this answer,了解使用不同工具的各种解决方案。


还有一个unix2dos 命令执行相反的操作:

它会修改 Unix 换行符,使其与 Windows 工具兼容。

如果您使用记事本打开一个文件并且所有行一起运行,请尝试unix2dos filename

【讨论】:

  • 漂亮,dos2unix 已修复,谢谢。我还添加了JAVA="$JAVA_HOME"/bin/java,现在它找到了我的Java!
  • 小心dos2unix;与大多数文本过滤器不同,它默认覆盖其输入文件。
  • dos2unix 让我保持理智。
  • 对我来说很明显是 windows 换行导致了这个问题,但我的问题是,我可以 make cygwin accept this newline(windows ) ?我很困惑,因为我在 cygwin 中克隆了一个 repo,其中包含 .sh 文件,但它们带有 \r\n 结尾......显然,即使我从 cygwin 中运行它,git 也会翻译换行符,或者 repo 没有带有 Windows 换行符的 bash shell 脚本 .sh 文件存在问题(或者没有人知道/关心 repo 包含不太可能的坏文件)。我知道 git 能够进行换行符转换,但我不希望它在 cygwin 上。
  • @naxa - 换行符可能是根据操作系统选择的:Cygwin = Windows
【解决方案2】:

对于那些没有安装 dos2unix 的人(并且不想安装它):

删除导致此错误的尾随 \r 字符:

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


说明

选项-i 用于就地 编辑,我们直接在输入文件中删除尾随\r。因此请注意正确键入模式。

【讨论】:

  • 非常感谢,这个解决方案也对我有用,我也觉得它是最简单的解决方案
  • 这应该是公认的最重要的答案。寻找一些 dos2unix commnd 不是最好的选择...
  • 如何在包含文件的整个目录上执行此操作?
  • 对当前目录中的所有文件执行此操作
    for i in *;do if [[ -f $i ]]; then sed -i 's/\r$//' "$i"; fi; done
  • 这对我来说很有帮助,因为我没有 sudo 访问权限来安装“dos2unix”
【解决方案3】:

对于具有Notepad++WINDOWS (shell) 用户(使用 v6.8.3 进行检查),您可以使用选项更正特定文件

  • 编辑 -> EOL 转换 -> Unix/OSX 格式

然后再次保存您的文件。

编辑:在 v7.5.1(2017 年 8 月 29 日)中仍然有效

编辑:2022 年 1 月 3 日。VSCode 被多次提及。转到 VSCode 中的设置并在搜索字段中键入 files.eol 并设置为 \n(Unix 格式)。请注意,这会为您的用户或所有文件的工作区更改此设置,并且可能不是您想要的。 YMMV。

【讨论】:

  • 发挥了洛基的魅力
  • 非常感谢。我之前在cygwin上试过dos2unix,还是不行。
  • 也可以使用 VsCode : ctrl+ship+p 并输入 >change end of line sequence,然后选择 EL 。
  • 这就是我真正想要的!
  • 您,先生,是个天才。正是我一直在寻找的。仍然有效。
【解决方案4】:

我正在使用 cygwin 和 Windows7,诀窍不是将 set -o igncr 放入您的 .bashrc 中,而是将整个 SHELLOPTS 放入 Windows 下的环境变量中。 (所以 unix / cygwin 什么都没有......)我认为它不适用于.bashrc,因为“水滴已经被吸走了” 正如我们用德语所说的那样。 ;-) 所以我的SHELLOPTS 看起来像这样

braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor

【讨论】:

  • SHELLOPTS 需要在 Windows 环境变量而不是 Cygwin 环境变量中设置的原因是因为该变量只能由 bash 读取(根据“man bash”)。所以它必须在你的 shell 启动之前设置 - 因此它必须进入一个 Windows 环境变量。
  • 我想为可能误解它的试错用户澄清答案:SHELLOPTS 中真正需要igncr
  • 这是唯一对我有用的解决方案。我有大量的脚本,不能在每个脚本上运行 dos2unix。
【解决方案5】:

SUBLIME 文本

用 sublime 你就去

查看 -> 行尾 -> (select)Unix

然后保存文件。将解决此问题。

就这么简单!

【讨论】:

  • 谢谢,我正在使用 sublime,编辑 WSL 文件,完全忘记了这个
  • 使其永久化,Preferences -> Settings, "default_line_endings": "unix"
【解决方案6】:

如果您使用的是最新的 Cygwin(例如 1.7),您还可以在第一个未注释的行上使用以下行开始 .bashrc.bash_profile

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is needed

这将强制 bash 忽略 Windows 行分隔符中使用的回车符 (\r)。

http://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html

【讨论】:

  • 这是我一直在寻找的,但对我来说没有用.. 一年后,这仍然有效吗?
  • edit: export SHELLOPTS 为我成功了!但偶尔我仍然会收到“无效的选项名称” - 为什么会这样?
  • 但是要工作,你需要把它放在所有脚本的顶部,而不仅仅是 .bashrc 和 .bash_profile。
  • 当您在 bash shell 中调用 /bin/sh (某些命令如 awk 隐含地执行)时,使用 export SHELLOPTS 可能会给您一个“无效的选项名称”。 sh 理解 SHELLOPTS,但不理解 igncr。
【解决方案7】:

尝试执行以下命令

vim .bashrc
:set ff=unix
:wq!

【讨论】:

  • 简直是最好的:)
  • 对我来说这就是答案
【解决方案8】:

错误:

'\r': 找不到命令

是由于 shell 无法识别类似于 Windows 的 CRLF 行尾 (0d 0a),因为它只需要 LF (0a)。


Git

如果您在 Windows 上使用 Git,请确保您在设置期间选择了“Checkout as-is”。然后确保运行:git config --global core.autocrlf false,这样 Git 在签出或提交文本文件时不会执行任何转换。


dos2unix

如果您不使用 Git,您只需将这些受影响的文件/脚本转换回类 Unix 行尾 (LF),方法是:

dos2unix ~/.bashrc

注意:dos2unix 命令是dos2unix 包的一部分。

Ex/Vim 编辑器 + tr

如果你安装了 Vim,下面的命令应该更正文件:

ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*

有用的别名:alias dos2unix="ex +'bufdo! %! tr -d \\\\r' -scxa".

tr

这里是使用tr的方法:

cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc

或:

tr -d '\r' < filename > new_filename

注意:\r 等同于\015


sed

你可以试试下面的命令:

sed -i'.bak' s/\r//g ~/.bash*

recode

以下别名可能有用(替换dos2unix 命令):

alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'

来源:Free Unix Tools (ssh, bash, etc) under Windows.


perl

以下perl命令可以将文件从DOS转换为Unix格式:

perl -p -i.bak -e 's/\015//g' ~/.bash*

来源:stripping the ^M.


tofrodos

在 Linux 上,比如 Ubuntu,它既不标配dos2unix 也不标配unix2dos,您可以安装tofrodos 包(sudo apt-get install tofrodos),并定义以下别名:

alias dos2unix=’fromdos’
alias unix2dos=’todos’

然后使用与上面相同的语法。


流浪者

如果您使用 Vagrant VM 并且在配置脚本中出现这种情况,请尝试将 binary 选项设置为 true

# Shell provisioner, see: https://www.vagrantup.com/docs/provisioning/shell.html
config.vm.provision "shell" do |s|
  s.binary = true # Replace Windows line endings with Unix line endings.
  s.path = "script.sh"
end

请参阅:Windows CRLF to Unix LF Issues in Vagrant

【讨论】:

  • 我没有找到命令 ^M。我该如何解决?或者更好:我如何搜索这个问题,因为 ^ 被搜索引擎剪切了?等等..我搜索了 git command not found 剥离 m
【解决方案9】:

您还可以在 bash 调用中添加选项 -o igncr,例如

bash -x -o igncr script.sh

【讨论】:

  • 这是做什么的,我在哪里可以获得更多关于这方面的文档?我可以在linux中使用它吗?
  • 这将运行带有选项igncr 的bash 脚本script.sh(= 忽略回车符(\r))。 -x 只是启用跟踪。在 Linux 中,igncr 选项似乎不可用,它可能是 Cygwin 独有的选项。
【解决方案10】:

根据这个gist,解决方案是创建一个~/.bash_profile(在HOME 目录中),其中包含:

export SHELLOPTS
set -o igncr

【讨论】:

  • 这是最好的答案。使脚本更不容易跨平台出错,并且不需要转换。
  • 这才是真正有效的答案! Windows 10 + CygWin64 我克隆了一个 git 并配置生成 '\r'-command not found 但文件不包含任何 '\r'!这发生在打开文件时,不能通过删除不存在的内容来防止。
【解决方案11】:

您可能使用notepad++ 来创建/更新此文件。

EOL(Edit->EOL Conversion) 默认转换为Windows。

在 Notepad++ 中更改 EOL 转换

Edit -> EOL Conversion -> Unix (LF)

【讨论】:

    【解决方案12】:

    用记事本++解决:

    1) 菜单->编辑->EOL 转换-> Unix/OSX 格式

    2) 然后保存

    固定

    【讨论】:

      【解决方案13】:

      使用 notepad++(6.8.1) 将 shell 脚本从 windows 传送到 linux 的人。

      在记事本++中设置以下内容 编辑 -> EOL 转换 -> Unix/OSX 格式

      【讨论】:

        【解决方案14】:

        我遇到了同样的问题。解决方法:我用pspad编辑器编辑文件,并给它一个unix格式(菜单-格式-> UNIX)

        我相信您可以使用许多其他编辑器将这种格式设置为您的文件

        【讨论】:

          【解决方案15】:

          对于 Emacs 用户:

          1. 打开文件
          2. M-x 设置缓冲区文件编码系统
          3. 选择“unix”

          这会将文件中的新字符更新为 unix 样式。有关 Emacs 中“换行表示”的更多信息,请参见此处:

          http://ergoemacs.org/emacs/emacs_line_ending_char.html

          注意:如果希望从命令行执行上述步骤,则可以将上述步骤制作成 Emacs 脚本。

          【讨论】:

            【解决方案16】:

            问题可能是由于从 Windows 机器创建/下载的文件/脚本而发生的。请尝试转换成linux文件格式。

            dos2unix ./script_name.sh
            

            dos2unix ~/.bashrc
            

            【讨论】:

              【解决方案17】:

              如果您在 Cygwin 安装中安装了 vim 包,则可以使用 vim 来修复此问题,而无需查找和替换。按如下方式启动 vim:vim filename.sh(通常也别名为 vi)。然后,键入:set fileformat=unix,然后键入:wq(写入并退出)以保存您的更改。 (: 让您进入 vim 的编辑模式。)

              我推荐这个而不是 dos2unix,因为 vim 可能更常用。

              但是,最好将文本编辑器设置为将您计划在 Unix/Linux 环境中使用的文件保存为 Unix 文本格式。上面针对 Notepad++ 给出的答案就是一个很好的例子。

              附加说明:如果您不确定文件是什么类型(DOS 或 Unix),您可以使用file filename.sh。这尤其有助于调试更模糊的问题(例如导入来自 Windows 的 SQL 转储时的编码问题)。

              有关如何修改文本文件格式的其他选项,请参阅this IU knowledge base article

              有关 Bash 脚本和行尾的更多背景信息,请参见 this StackOverflow question

              【讨论】:

                【解决方案18】:

                EditPlus 中,您从 Document → File Format (CR/LF) → Change File Format... 菜单,然后选择 Unix / Mac OS X 单选按钮。

                【讨论】:

                  【解决方案19】:

                  1。选择

                  EditorConfig——是我的选择。


                  2。相关性

                  此答案与 2018 年 3 月相关。将来,此答案中的数据可能会过时。

                  此答案的作者在 2018 年 3 月亲自使用 EditorConfig。


                  3。限制

                  您需要使用one of supported IDE/editors


                  4。论证

                  1. 简单的用法。我需要设置我的 .editorconfig 文件 1 次,在其中创建我的项目,→ 我可以忘记 some platform-, style- and IDE-specific problems
                  2. Cross-platform, cross-languages, cross-IDE, cross-editors

                  5。示例

                  5.1。简单

                  我为 Sublime Text → 我的文本编辑器安装了EditorConfig plugin。我在 Sublime Text 中编辑文件。

                  比如我有sashacrlf.sh文件:

                  echo "Sasha" &
                  echo "Goddess!" &
                  

                  我在 Cygwin 中运行这个文件:

                  $ bash sashacrlf.sh
                  Sasha
                  sashacrlf.sh: line 1: $'\r': command not found
                  Goddess!
                  

                  我在与sashacrlf.sh 相同的项目中创建了一个文件.editorconfig

                  [*.sh]
                  end_of_line = lf
                  

                  这意味着,如果您在编辑器的项目中保存任何扩展名为 .sh 的文件,EditorConfig 会为此文件设置 UNIX 行结尾。

                  我再次将sashacrlf.sh 保存在我的文本编辑器中。我再次运行sashacrlf.sh

                  $ bash sashacrlf.sh
                  Sasha
                  Goddess!
                  

                  我无法在控制台中获得意外输出。

                  5.2。多个文件扩展名

                  例如,我想在所有扩展名为 .sh.bashrc.bash_profile 的文件中使用 UNIX 行结尾。 我将这些行添加到我的 .editorconfig 文件中:

                  [*.{sh,bashrc,bash_profile}]
                  end_of_line = lf
                  

                  现在,如果我用.sh.bashrc.bash_profile 扩展名保存任何文件,EditorConfig 会自动为此文件设置 UNIX 行结尾。


                  6。附加链接

                  【讨论】:

                    猜你喜欢
                    • 2021-09-16
                    • 2013-09-07
                    • 2014-10-08
                    • 1970-01-01
                    • 2020-08-25
                    相关资源
                    最近更新 更多