340

我有 Windows,使用 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/

所以我相信文件应该放在正确的位置。

4

19 回答 19

408

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

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

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

-bash: '\r': command not found

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

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

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

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

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

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


还有一个unix2dos相反的命令:

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

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

于 2012-07-23T17:10:35.583 回答
336

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

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

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


说明

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

于 2015-10-02T17:42:35.523 回答
119

对于使用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。

于 2015-10-06T15:15:22.223 回答
39

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

braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor
于 2013-06-11T12:08:01.837 回答
34

崇高的文字

有了崇高,你就去

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

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

就这么简单!

于 2015-09-29T13:36:16.103 回答
30

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

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

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

于 2012-07-28T11:02:38.477 回答
24

尝试执行以下命令

vim .bashrc
:set ff=unix
:wq!
于 2018-08-23T16:44:32.580 回答
22

错误:

'\r': 找不到相关命令

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


吉特

如果您在 Windows 上使用 Git,请确保您在设置期间选择了“按原样结帐”。然后确保你运行: 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'

来源:Windows 下的免费 Unix 工具(ssh、bash 等)


perl

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

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

资料来源:剥离 ^M


tofrodos

在 Linux 上,比如 Ubuntu,它不带有dos2unixor的标准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

请参阅:Vagrant 中的 Windows CRLF 到 Unix LF 问题

于 2016-03-08T16:24:10.410 回答
18

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

bash -x -o igncr script.sh
于 2014-03-18T13:39:30.210 回答
11

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

export SHELLOPTS
set -o igncr
于 2017-06-02T23:22:04.707 回答
7

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

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

在 Notepad++ 中更改 EOL 转换

Edit -> EOL Conversion -> Unix (LF)
于 2018-05-30T06:15:19.183 回答
6

用记事本++解决:

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

2)然后保存

固定的

于 2015-11-06T14:11:08.170 回答
5

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

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

于 2015-11-30T02:59:44.937 回答
3

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

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

于 2015-02-24T09:08:31.733 回答
3

对于那里的 Emacs 用户:

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

这会将文件中的新字符更新为 unix 样式。更多关于 Emacs 中“换行表示”的信息可以在这里找到:

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

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

于 2015-09-21T17:37:51.280 回答
2

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

dos2unix ./script_name.sh

或者

dos2unix ~/.bashrc
于 2017-05-25T07:17:36.163 回答
2

如果您在 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 转储时的编码问题)。

有关如何修改文本文件格式的其他选项,请参阅此 IU 知识库文章

有关 Bash 脚本和行尾的更多背景信息,请参阅此 StackOverflow 问题

于 2018-07-20T05:11:46.847 回答
1

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

于 2016-11-16T12:57:28.580 回答
-1

1. 选择

编辑器配置 EditorConfig — 是我的选择。


2.相关性

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

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


3. 限制

您需要使用受支持的 IDE/编辑器之一


4. 论证

  1. 简单的用法。我需要设置我的.editorconfig文件 1 次,在那里我创建我的项目,→ 我可以忘记一些特定于平台、样式和 IDE 的问题
  2. 跨平台、跨语言、跨IDE、跨编辑器

5. 例子

5.1。简单的

我为 Sublime Text → 我的文本编辑器安装了EditorConfig 插件。我在 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. 我将这些行添加到我的.editorconfig文件中:

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

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


6. 附加链接

于 2018-03-01T13:10:10.323 回答