0

使用cygwin,我有

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

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

这是为什么 ?

4

2 回答 2

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 格式保存的文本编辑器。

于 2013-06-21T14:41:57.217 回答
0

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

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

这是默认选项,并且正在破坏我所有克隆的 shell 脚本。

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

在此处输入图像描述

于 2021-04-21T21:37:28.983 回答