我有窗口,使用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/
所以我认为文件应该放在正确的位置。
答案 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)
删除导致此错误的尾随\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
)引起的,因为它只需要LF
(0a
)。
如果您在Windows上使用Git,请务必选择' Checkout in-is '在安装过程中然后确保您运行:git config --global core.autocrlf false
,因此Git在签出或提交文本文件时不会执行任何转换。
dos2unix
如果你不使用Git,你只需将这些受影响的文件/脚本转换回类似Unix的行尾(LF),或者通过:
dos2unix ~/.bashrc
注意:dos2unix
命令是dos2unix
包的一部分。
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虚拟机而配置脚本会出现这种情况,请尝试将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
答案 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)
这会将文件中的新字符更新为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)
EditorConfig - 是我的选择。
这个答案与2018年3月有关。将来,这个答案的数据可能已经过时了。
本回答的作者于2018年3月亲自使用了EditorConfig。
您需要使用one of supported IDE/editors。
.editorconfig
文件1次,我创建项目的地方,→我可以忘记some platform-, style- and IDE-specific problems。我为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!
我无法在控制台中获得意外的输出。
例如,我想在所有扩展名为.sh
,.bashrc
和.bash_profile
的文件中包含UNIX行结尾。
我将这些行添加到.editorconfig
文件中:
[*.{sh,bashrc,bash_profile}]
end_of_line = lf
现在,如果我保存任何带有.sh
,.bashrc
或.bash_profile
扩展名的文件,EditorConfig会自动为此文件设置UNIX行结尾。
答案 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脚本和行尾的更多背景信息。