Bash 哦 文档→ 文件格式(CR/LF)→ 更改文件格式…菜单,然后选择Unix/Mac OS X单选按钮。
问题可能是由于从windows计算机创建/下载的文件/脚本造成的。请尝试转换为linux文件格式Bash 哦 文档→ 文件格式(CR/LF)→ 更改文件格式…菜单,然后选择Unix/Mac OS X单选按钮。,bash,shell,cygwin,newline,Bash,Shell,Cygwin,Newline,问题可能是由于从windows计算机创建/下载的文件/脚本造成的。请尝试转换为linux文件格式 dos2unix ./script_name.sh 或 因此,解决方案是创建一个~/.bash\u配置文件(在主页目录中),其中包含: export SHELLOPTS set -o igncr 1.选择 -这是我的选择 2.关联 该答案与2018年3月相关。将来,这个答案中的数据可能会过时 本答案的作者于2018年3月亲自使用了EditorConfig 3.局限性 你需要使用 4.论证
dos2unix ./script_name.sh
或
因此,解决方案是创建一个~/.bash\u配置文件
(在主页
目录中),其中包含:
export SHELLOPTS
set -o igncr
1.选择
-这是我的选择
2.关联 该答案与2018年3月相关。将来,这个答案中的数据可能会过时 本答案的作者于2018年3月亲自使用了EditorConfig
3.局限性 你需要使用
4.论证
.editorconfig
文件1次,在那里我创建了我的项目,→ 我可以忘记5.例子 5.1. 简单的 我为崇高的文本安装→ 我的文本编辑器。我用升华文本编辑文件 例如,我有
sashacrf.sh
文件:
echo“Sasha”&
回声“女神!”&
我在Cygwin中运行此文件:
$bash sasharclf.sh
萨沙
sasharlf.sh:第1行:$'\r':未找到命令
女神!
我在与sashacrf.sh
相同的项目中创建了一个文件.editorconfig
[*.sh]
_线的_端=lf
这意味着,如果在编辑器中保存项目中扩展名为.sh
的任何文件,EditorConfig将为此文件设置UNIX行结尾
我再次在文本编辑器中保存sashacrf.sh
。我再次运行sashacrf.sh
:
$bash sasharclf.sh
萨沙
女神!
我无法在控制台中获得意外的输出
5.2. 多个文件扩展名
例如,我希望在所有扩展名为.sh
、.bashrc
和.bash\u profile
的文件中使用UNIX行结尾。
我将这些行添加到我的.editorconfig
文件中:
[*.{sh,bashrc,bash_profile}]
_线的_端=lf
现在,如果我保存任何扩展名为.sh
、.bashrc
或.bash\u profile
的文件,EditorConfig会自动为该文件设置UNIX行结束
6.附加链接
Edit -> EOL Conversion -> Unix (LF)
如果在Cygwin安装中安装了vim软件包,则可以使用vim修复此问题,而无需查找和更换。按如下方式启动vim:
vim filename.sh
(通常它也被别名为vi)。然后,键入:set fileformat=unix
,然后键入:wq
(写入并退出)保存更改。(:
将您置于vim的编辑模式。)
我建议您不要使用dos2unix,因为vim可能更常见
但是,最好将文本编辑器设置为将计划在Unix/Linux环境中使用的文件保存为Unix文本格式。上面给出的Notepad++的答案就是一个很好的例子
附加说明:如果不确定文件的类型(DOS或Unix),可以使用文件名.sh
。这尤其有助于调试更模糊的问题(例如从Windows导入SQL转储时的编码问题)
有关如何修改文本文件格式的其他选项,请参见
有关Bash脚本和行尾的更多背景信息,请参见。尝试执行以下命令
vim .bashrc
:set ff=unix
:wq!
echo~
给出了什么?$echo~/cygdrive/c/Users/jhsu/这个问题并不特定于cygwin——如果在DOS机器上创建一个脚本并将其二进制传输到Linux系统并在那里运行,同样的问题也会发生;我已经从标题中删除了cygwin引用,因此在其他情况下出现此问题的人更可能认真对待此问题(及其非cygwin特定的答案)。有关cygwin的背景知识,似乎在2007年左右,Cygwin开始以Unix风格处理回车-请参阅。该论坛帖子解释了下面几个答案中讨论的igncr shell选项。在命令行上,export SHELLOPTS
,然后set-o igncr
为Mebeauty运行配置脚本,dos2unix修复了它,谢谢。我还添加了JAVA=“$JAVA_HOME”/bin/JAVA
,现在它找到了我的JAVA!小心使用dos2unix
;与大多数文本筛选器不同,默认情况下,它会覆盖其输入文件。dos2unix使我保持理智。很明显,windows换行符造成了此问题,但我的问题是,我可以让cygwin也接受此换行符(windows)吗?我很困惑,因为我在cygwin中克隆了一个repo,其中包含.sh文件,但它们有\r\n结尾。。。显然,要么是git翻译了新行,即使我从cygwin内部运行它,要么是repo对带有windows新行的bash shell script.sh文件没有问题(或者没有人知道/关心repo包含不太可能的坏文件)。我知道git可以进行换行转换,但我不希望它出现在cygwin上。@naxa-换行可能是基于OS:cygwin=Windows选择的。这是我一直在寻找的,但对我来说没有效果。。一年后,这是否仍然有效?编辑:export SHELLOPTS
帮了我的忙!但有时我仍然会得到“无效选项名”——为什么?从这里开始:但要工作,您需要将它放在所有脚本的顶部,而不仅仅是.bashrc和.bash_配置文件。当您在bash shell中调用/bin/sh(某些命令如awk隐式地执行)时,使用export-SHELLOPTS可能会得到“无效选项名”。sh理解SHELLOPTS,但不理解igncr。需要在Windows环境变量而不是Cygwin环境变量中设置SHELLOPTS的原因是,该变量仅由bash读取(根据“man bash”)。所以
# ~/.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
braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor
bash -x -o igncr script.sh
sed -i 's/\r$//' filename
dos2unix ~/.bashrc
ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*
cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc
tr -d '\r' < filename > new_filename
sed -i'.bak' s/\r//g ~/.bash*
alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'
perl -p -i.bak -e 's/\015//g' ~/.bash*
alias dos2unix=’fromdos’
alias unix2dos=’todos’
# 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
dos2unix ./script_name.sh
dos2unix ~/.bashrc
export SHELLOPTS
set -o igncr
Edit -> EOL Conversion -> Unix (LF)
vim .bashrc
:set ff=unix
:wq!