Запуск bash script в cygwin на окнах 7
Я пытаюсь запустить ниже bash script в cygwin на windows 7
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++ ))
script отлично работает на сервере ubuntu. Но мне нужно запустить его сейчас на машине с Windows.
Ответы
Ответ 1
Последняя версия Cygwin, по-видимому, поддерживает только файлы в формате Unix (т.е. с \n для новых строк, в отличие от новой строки DOS/Windows\r\n).
Чтобы исправить это, запустите утилиту /bin/dos 2unix.exe, предоставив script в качестве аргумента команды:
e.g. /bin/dos2unix.exe myScript.sh
Это преобразует его в формат Unix, и тогда вы сможете его запустить.
Ответ 2
Если вы не можете исправить все ваши сценарии, вы должны иметь возможность изменить поведение EOL в Cygwin, установив опцию игнорировать CR:
set -o igncr
Если вы добавите это в свой .bash_profile, он будет глобально установлен по умолчанию при входе в систему:
export SHELLOPTS
set -o igncr
Вы также можете сделать это за script внутренне, поставив эту строку сразу после #! строка:
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required
Вам нужен комментарий, чтобы игнорировать CR в этой строке, которая читается до того, как этот параметр вступит в силу.