关于bash:’ ‘:找不到命令 – .bashrc / .bash_profile

'
': command not found - .bashrc / .bash_profile

本问题已经有最佳答案,请猛点这里访问。

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

.bashrc中:

1
2
export PATH="$JAVA_HOME/bin:$PATH"  
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"

.bash_profile文件:

1
2
3
if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

运行cygwin:

1
2
3
4
5
6
-bash: $'\377\376if': command not found
-bash: $'then
'
: 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'

我不确定我是从一个专门针对另一个系统的教程中获取命令,还是我错过了一个步骤。 或者空格导致我的命令无法正常运行。

我已经查看了多个类似的问题,但我没有找到一个问题确切存在我的错误。

我的家乡之路:

1
2
3
4
$ echo $HOME
/cygdrive/c/Users/jhsu
$ echo ~
/cygdrive/c/Users/jhsu/

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


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

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

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

-bash: '
': command not found

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

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

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

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

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

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

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

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

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


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

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

1
2
sed -i 's/
$//'
filename

说明:

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


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

并再次保存您的文件。

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


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

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


如果您使用的是最近的Cygwin(例如1.7),您还可以在第一个非注释行上使用以下行启动.bashrc.bash_profile

1
2
3
4
# ~/.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行分隔符中使用的回车符(
)。

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


SUBLIME TEXT

有了崇高,你就去吧

View - > Line Endings -> (select)Unix

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

很容易!


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

1
bash -x -o igncr script.sh

错误:

'
'
: command not found

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

混帐

如果您在Windows上使用Git,请确保在安装过程中选择了"Checkout as-is"。然后确保运行:git config --global core.autocrlf false,因此Git在签出或提交文本文件时不会执行任何转换。

dos2unix

如果你不使用Git,你只需要将这些受影响的文件/脚本转换回类似Unix的行尾(LF),或者通过:

1
dos2unix ~/.bashrc

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

Ex / Vim编辑器+ tr

如果已安装Vim,则以下命令应更正文件:

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

有用的别名:alias dos2unix="ex +'bufdo! %! tr -d \\\
' -scxa"

tr

这是使用tr的方法:

1
2
cat ~/.bashrc | tr -d '
'
> ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc

要么:

1
2
tr -d '
'
< filename > new_filename

注意:
相当于\015

sed

您可以尝试以下命令:

1
2
sed -i'.bak' s/
//g ~/.bash*

recode

以下别名可能很有用(它取代了dos2unix命令):

1
2
alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'

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

perl

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

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

来源:剥离^ M.

tofrodos

在Linux上,比如Ubuntu,它不是标准的dos2unixunix2dos,你可以安装tofrodos包(sudo apt-get install tofrodos),并定义以下别名:

1
2
alias dos2unix=’fromdos’
alias unix2dos=’todos’

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

流浪汉

如果您正在使用Vagrant VM并且配置脚本会出现这种情况,请尝试将binary选项设置为true

1
2
3
4
5
# 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问题。


尝试执行以下命令

1
2
3
vim .bashrc
:set ff=unix
:wq!


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

1
2
export SHELLOPTS
set -o igncr


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

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


用Notepad ++解决:

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

2)然后保存

固定


对于那里的Emacs用户:

  • 打开文件
  • M-x set-buffer-file-coding-system
  • 选择"unix"
  • 这会将文件中的新字符更新为unix样式。有关Emacs中"Newline Representation"的更多信息,请访问:

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

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


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

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


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

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

    在Notepad ++中更改EOL转换

    1
    Edit -> EOL Conversion -> Unix (LF)

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


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

    1
    dos2unix ./script_name.sh

    要么

    1
    dos2unix ~/.bashrc

    1.选择

    EditorConfig EditorConfig - 是我的选择。

    2.相关性

    这个答案与2018年3月相关。将来,这个答案的数据可能已经过时了。

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

    3.限制

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

    4.论证

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

    5.1。简单

    我为Sublime Text→我的文本编辑器安装了EditorConfig插件。我在Sublime Text中编辑文件。

    例如,我有sashacrlf.sh文件:

    1
    2
    echo"Sasha" &
    echo"Goddess!" &

    我在Cygwin中运行这个文件:

    1
    2
    3
    4
    5
    $ bash sashacrlf.sh
    Sasha
    sashacrlf.sh: line 1: $'
    '
    : command not found
    Goddess!

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

    1
    2
    [*.sh]
    end_of_line = lf

    这意味着,如果在编辑器中将任何带有.sh扩展名的文件保存在项目中,则EditorConfig会为此文件设置UNIX行结尾。

    我再次在文本编辑器中保存sashacrlf.sh。我再次运行sashacrlf.sh

    1
    2
    3
    $ bash sashacrlf.sh
    Sasha
    Goddess!

    我无法在控制台中获得意外的输出。

    5.2。多个文件扩展名

    例如,我想在所有扩展名为.sh.bashrc.bash_profile的文件中使用UNIX行结尾。
    我将这些行添加到我的.editorconfig文件中:

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

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

    6.其他链接

    • EditorConfig官方网站。

    如果您在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问题。