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

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

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

483624 次浏览

当一切都在Cygwin失败时……

尝试在有问题的文件上运行dos2unix命令。

当你看到这样的错误消息时,它可能会有所帮助:

-bash: '\r': command not found

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

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

警告: dos2unix命令修改文件在适当的位置,所以如果有必要请注意。

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

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

查看这个答案以获得使用不同工具的各种解决方案。


还有一个unix2dos命令做相反的事情:

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

如果你用记事本打开一个文件,所有的行一起运行,试试unix2dos filename

如果你正在使用最新的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

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

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

你也可以在bash调用中添加选项-o igncr

bash -x -o igncr script.sh

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

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

对于Emacs用户:

  1. 打开文件
  2. m x set-buffer-file-coding-system
  3. 选择“unix"

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

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

注意:如果您更喜欢从命令行执行上述步骤,则可以将其放入Emacs脚本中。

崇高的文本

有了sublime你就去了

View -> Line ends -> (select)Unix . xml

然后保存文件。将修复此问题。

就这么简单!

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

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

sed -i 's/\r$//' filename
< p > < br > 解释< / >强:

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

对于窗户 (shell)用户,使用notepad++(通过v6.8.3检查),可以使用该选项纠正特定的文件

    <李>编辑 →生物转化 →李Unix / OSX格式< / >

然后再次保存文件。

编辑:在7.5.1版仍然有效(2017年8月29日)

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

错误:

'\r':命令未找到

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


Git

如果你在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,它既没有标准的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到Unix LF的问题在流浪者

文字编辑器中,您从 Document → File Format (CR/LF) → Change File Format...菜单,然后选择Unix / Mac OS X单选按钮

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

dos2unix ./script_name.sh

dos2unix ~/.bashrc

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

export SHELLOPTS
set -o igncr

1. 选择

EditorConfig < >强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!

我在与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. 额外的链接

可能你使用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(写入&Quit)以保存更改。(:让你进入vim的编辑模式。)

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

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

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

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

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

尝试执行以下命令

vim .bashrc
:set ff=unix
:wq!