'\ r':找不到命令 - .bashrc / .bash_profile

时间:2012-07-23 16:45:54

标签: bash shell cygwin newline

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

.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/

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

19 个答案:

答案 0 :(得分:306)

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

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

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

-bash: '\r': command not found

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

dos2unix命令修改换行符,因此它们与Unix / Cygwin兼容。

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

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

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

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


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

它修改了Unix换行符,因此它们与Windows工具兼容。

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

答案 1 :(得分:176)

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

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

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


说明

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

答案 2 :(得分:37)

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

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

答案 3 :(得分:36)

对于带有Notepad++ WINDOWS 用户(使用v6.8.3检查),您可以使用该选项更正特定文件 - 编辑 - > EOL转换 - > Unix / OSX格式

再次保存您的文件。

编辑:仍然适用于v7.5.1(2017年8月29日)

答案 4 :(得分:26)

如果您使用的是最近的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

答案 5 :(得分:21)

SUBLIME TEXT

随着崇高,你只需去

  

查看 - >线路结尾 - > (选择)的Unix

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

这很容易!

答案 6 :(得分:17)

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

bash -x -o igncr script.sh

答案 7 :(得分:12)

错误:

  

'\r':找不到命令

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

GIT中

如果您在Windows上使用Git,请务必选择' Checkout in-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一样,dos2unixunix2dos都没有标准,你可以安装tofrodos包(sudo apt-get install tofrodos),并定义以下别名:

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

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

流浪

如果您正在使用Vagrant虚拟机而配置脚本会出现这种情况,请尝试将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

答案 8 :(得分:7)

尝试执行以下命令

viewport.removeAll();
viewport.repaint();

答案 9 :(得分:7)

根据此gist,解决方案是创建一个HOME(在export SHELLOPTS set -o igncr 目录中),其中包含:

if

答案 10 :(得分:3)

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

在notepad ++中设置以下内容 编辑 - &gt; EOL转换 - &gt; Unix / OSX格式

答案 11 :(得分:3)

使用Notepad ++解决:

1)菜单 - &gt;编辑 - &gt; EOL转换 - &gt; Unix / OSX格式

2)然后保存

修正了

答案 12 :(得分:2)

对于那里的Emacs用户:

  1. 打开文件
  2. M-x set-buffer-file-coding-system
  3. 选择&#34; unix&#34;
  4. 这会将文件中的新字符更新为unix样式。更多关于&#34; Newline Representation&#34;的信息在Emacs可以在这里找到:

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

    注意:如果首选从命令行执行此操作,则可以将上述步骤转换为Emacs脚本。

答案 13 :(得分:2)

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

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

答案 14 :(得分:0)

EditPlus中你可以从中做到这一点 Document → File Format (CR/LF) → Change File Format...菜单,然后选择Unix / Mac OS X单选按钮。

答案 15 :(得分:0)

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

dos2unix ./script_name.sh

dos2unix ~/.bashrc

答案 16 :(得分:0)

1。选择

EditorConfig 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
  3. 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!
    

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

    [*.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。其他链接

答案 17 :(得分:0)

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

EOL(编辑 - &gt; EOL转换)默认情况下,转换为Windows。

在Notepad ++中更改EOL转换

Edit -> EOL Conversion -> Unix (LF)

答案 18 :(得分:0)

如果在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

有关this StackOverflow question上有关Bash脚本和行尾的更多背景信息。