为什么这个错误发生在bash中?

时间:2013-06-21 09:40:56

标签: bash cygwin sh

使用cygwin,我有

currentFold="`dirname $0`"
echo ${currentFold}...

输出... gdrive / c /而不是/ cygdrive / c /...

为什么?

2 个答案:

答案 0 :(得分:2)

您的脚本以DOS格式存储,在每行末尾带有回车符后跟换行符(有时写成“\ r \ n”); unix在行的末尾仅使用换行符(“\ n”),因此bash错误地将部分命令的回车符。当它看到

currentFold="`dirname $0`"\r

它尽职尽责地将currentFold设置为“/ cygdrive / c / \ r”,当它看到时

echo ${currentFold}...\r

打印“/cygdrive/c/\r...\r”。最后的回车并不重要,但是中间的回车意味着“......”打印在“/ cy”的顶部,你最终得到“...... gdrive / c /”。

解决方案:将脚本转换为unix格式;我相信你会有dos2unix命令,但你可能需要四处寻找替代方案。在紧要关头,您可以使用

perl -pi -e 's/\r\n?/\n/g' /path/to/script

(见http://www.commandlinefu.com/commands/view/5088/convert-files-from-dos-line-endings-to-unix-line-endings)。然后切换到以unix格式而不是DOS格式保存的文本编辑器。

答案 1 :(得分:0)

我想补充戈登戴维森的回答。

我也在使用 Cygwin。就我而言,这是因为我的 Windows 版 Git 配置为 Checkout Windows-style, commint Unix style line endings

这是默认选项,它破坏了我所有克隆的 shell 脚本。

我重新运行了我的 git 设置并更改为 Checkout as-is, commit Unix-style line endings,这完全阻止了问题的发生。

enter image description here