我有一些窗口,使用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/

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


当前回答

错误:

“\r”:命令未找到

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


Git

如果你在Windows上使用Git,确保你在安装过程中选择了“Checkout as-is”。然后确保你运行:git config——global core。selflf为false,所以Git在签出或提交文本文件时不会执行任何转换。


dos2unix

如果你不使用Git,你只需要将这些受影响的文件/脚本转换回类似unix的行结束符(LF),可以通过以下方法:

dos2unix ~/.bashrc

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

Ex/Vim编辑器+ tr

如果你已经安装了Vim,下面的命令应该会纠正这些文件:

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

有用的别名:别名dos2unix=“ex +'bufdo!”% !tr -d - r -scxa。

tr

下面是使用tr的方法:

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

or:

tr -d '\r' < filename > new_filename

注意:\r等于\015。


sed

您可以尝试以下命令:

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

重新编码

以下别名可能很有用(替换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,它没有标准的dos2unix或unix2dos,你可以安装tofrodos包(sudo apt-get install tofrodos),并定义以下别名:

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

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


流浪的

如果你正在使用Vagrant VM,并且这种情况发生在配置脚本中,请尝试将二进制选项设置为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到Unix LF的问题在流浪者。

其他回答

问题可能是因为在windows机器上创建/下载的文件/脚本。请尝试转换成linux文件格式。

dos2unix ./script_name.sh

or

dos2unix ~/.bashrc

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

bash -x -o igncr script.sh

对于那些没有安装dos2unix(也不想安装它)的用户:

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

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

解释:

选项-i用于就地编辑,我们直接在输入文件中删除后面的\r。因此,要注意正确地输入图案。

可能你使用notepad++来创建/更新这个文件。

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

在notepad++中更改EOL转换

Edit -> EOL Conversion -> Unix (LF)

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

我推荐它而不是dos2unix,因为vim可能更常被安装。

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

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

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

关于Bash脚本和行尾的更多背景信息可以在这个StackOverflow问题中找到。