【问题标题】:running bash script in cygwin on windows 7 [duplicate]在 Windows 7 上的 cygwin 中运行 bash 脚本 [重复]
【发布时间】:2013-01-13 23:00:48
【问题描述】:

我正在尝试在 Windows 7 上的 cygwin 中运行以下 bash 脚本

REPEATTIMES="$1"

if [ $# = 0 ]; then

    echo "Usage: fetch topN repeatTimes"
    exit 1
fi

for (( i=1; i<=$REPEATTIMES; i++ ))
do
    echo "ITERATION: $i"
    echo "GENERATING"

    log=thelogs/log 

    bin/nutch generate crawl/segment -topN 10 > $log
    batchId=`sed -n 's|.*batch id: \(.*\)|\1|p' < $log`

    echo "batch id: $batchId "

    # rename log file by appending the batch id
    log2=$log$batchId
    mv $log $log2
    log=$log2

    echo "FETCHING"
    bin/nutch fetch crawl/segments/$batchId >> $log

    echo "PARSING"
    bin/nutch parse crawl/segments/$batchId >> $log


    echo "UPDATING DB"
    bin/nutch updatedb crawl/crawldb crawl/segments/$batchId >> $log

    echo "Done "

done

但是当我运行它时,我得到了错误:

line 11 :syntax error near unexpected token '$'\r'

line 11 :'for (( i=1; i<= REPEATTIMES; i++ ))

脚本在 ubuntu 服务器上运行良好。但我现在需要在 Windows 机器上运行它。

【问题讨论】:

  • 你在文件上试过dos2unix吗?如果你用记事本或其他东西编辑它并在那里得到 CRLF 字符,那可能会把事情搞砸。如果我没记错的话,Cygwin 只会将 LF 字符视为换行符。

标签: bash windows-7 cygwin


【解决方案1】:

最新版本的 Cygwin 似乎只支持 Unix 格式的文件(即用 \n 表示换行符,而不是 DOS/Windows 的 \r\n 换行符)。

要解决此问题,请运行 /bin/dos2unix.exe 实用程序,将您的脚本作为命令的参数:

e.g. /bin/dos2unix.exe myScript.sh

这会将其转换为 Unix 格式,然后您应该能够运行它。

【讨论】:

  • 你可以在这里下载它:sourceforge.net/projects/dos2unix -> 解压它,你现在应该在某处有一个文件 dos2unix.exe -> 打开一个新的 cygwin 终端 -> cd 到你的脚本 -> 运行 myScript.sh -> 记得将路径中的所有“\”替换为“/”
【解决方案2】:

如果您无法修复所有脚本,您应该能够通过设置忽略 CR 的选项来修改 Cygwin 中的 EOL 行为:

set -o igncr

如果你把它添加到你的 .bash_profile 中,它会在你登录时默认全局设置:

export SHELLOPTS
set -o igncr

您也可以在每个脚本内部执行此操作,方法是将此行放在 #! 之后。行:

(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required

您需要注释来忽略该选项生效前读取的该行中的 CR。

【讨论】:

  • export SHELLOPTS 为我解决了问题!但偶尔我仍然会收到“无效的选项名称” - 为什么会这样?
  • 您也可以将 SHELLOPTS 定义为 Windows 环境变量并将其设置为“igncr”,而不是导出 SHELLOPTS(它有副作用,但不太可能产生影响)。除了设置自己的默认值之外,每个 BASH 实例都将继承此选项。
  • @William - 不错!我喜欢你的解决方案。这比我转换每个脚本的方法要容易得多。
  • +1 用于解释为什么“需要此评论”。
  • 不适合我...
最近更新 更多