2013-09-15 5 views
1

Я пытаюсь создать docsets для Dash, следуя этим инструкциям: http://kapeli.com/docsets. Проблема заключается в том, что сценарий не продолжается после wget и не вызывает никаких ошибок. Все работает нормально, когда я копирую сценарий в терминал.bash script не заканчивается

Я использую MacOS 10.8.4 и по умолчанию bash.

#!/usr/bin/env bash 
set -e 

mkdir -p $1.docset/Contents/Resources/Documents/ 
wget -rkp -l3 -np -nH --cut-dirs=1 --directory-prefix="./"$1".docset/Contents/Resources/Documents/" $2 

echo '<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
    <plist version="1.0"> 
    <dict> 
    <key>CFBundleIdentifier</key> 
    <string>'$1'</string> 
    <key>CFBundleName</key> 
    <string>'$1'</string> 
    <key>DocSetPlatformFamily</key> 
    <string>'$1'</string> 
    <key>isDashDocset</key> 
    <true/> 
    </dict> 
    </plist>' > $1.docset/Contents/Info.plist 

touch $1.docset/Contents/Resources/docSet.dsidx 
sqlite3 $1.docset/Contents/Resources/docSet.dsidx " 
CREATE TABLE searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT); 
CREATE UNIQUE INDEX anchor ON searchIndex (name, type, path); 
INSERT INTO searchIndex (name, type, path) VALUES ('index', 'Guide', 'index.html');" 

Wget получает довольно много ошибок 404 и возвращает статус выхода 8 (echo $?). Фактический вопрос решается тогда, однако, я до сих пор не знаю, что с этим делать: удаление set -e работает, прекрасно, но не кажется правильным.

+0

Можете ли вы поделиться, какие значения используются для командной строки аргументов? – masahji

ответ

1

Вы позволили set -e. Ваш скрипт завершится, если одна из команд вернет ненулевой код выхода. Некоторые просто закончили бы без сообщения.

Чтобы узнать, какая команда вызывает проблему, запустите скрипт с -x:

bash -x script.sh 

Или добавьте комплект -x перед ним:

set -x 
set -e 
+0

Пробовал это, так же как и до того, как он отлично работает до тех пор, пока wget не будет завершен, тогда все остальное просто игнорируется. –

+1

@basszwo Вы не видите, как другие бегут? Тогда это проблема с wget. Можете ли вы добавить опцию '-v' или' --verbose', чтобы увидеть возможные сообщения об ошибках. – konsolebox

+0

Wget получает довольно много ошибок 404 и возвращает статус выхода 8 (echo $?). Фактический вопрос решается тогда, однако, я до сих пор не знаю, что с этим делать: удаление «set -e» отлично работает, но не кажется правильным. –

1

UPDATE

Мой первоначальный ответ был недоразумение вашего вопроса. Одной из проблем, которая, как представляется, является проблема, является ваш:

INSERT INTO searchIndex (name, type, path) VALUES (index, Guide, 'index.html'); 

Не уверен здесь. Но, похоже, вы можете захотеть сделать index и Guide строк, например, так:

INSERT INTO searchIndex (name, type, path) VALUES ('index', 'Guide', 'index.html'); 
+0

Это означает, что $ 1 (имя docset) объединяется в префикс.Есть ли лучший (правильный, не нарушающий) способ сделать это? –

+1

@basszwo Хорошо, только что заметил, что вы обновили свой INSERT. – masahji

1

Попробуйте использовать здесь документы, что-то вроде этого:

cat > "$1.docset/Contents/Info.plist" << EOF 
    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
    <plist version="1.0"> 
    <dict> 
    <key>CFBundleIdentifier</key> 
    <string>$1</string> 
    <key>CFBundleName</key> 
    <string>$1</string> 
    <key>DocSetPlatformFamily</key> 
    <string>$1</string> 
    <key>isDashDocset</key> 
    <true/> 
    </dict> 
    </plist> 
EOF 

Меньше чем вероятность проголосовать

+0

Правильно, спасибо. Однако это не решает проблему. Все, что после строки wget полностью игнорируется. –

1

Состояние выхода 8 для wget означает, что для одного из файловых серверов была возвращена ошибка (например, 404):

Сервер выдал сообщение об ошибке.

Вы можете либо хотите, чтобы исправить URL, так что они указывают на правильные URL-адреса, или игнорировать статус выхода wget, например,

wget ... || true 

Примечание: Выше будет работать, если вы не имеете в pipefail опция включена.

Другой способ сравнить состояние выхода и игнорировать, когда он вернулся 8, например .:

wget ... || { [ $? -ne 0 ] && [ $? -ne 8 ] && echo Success || exit 1; } 

См: Wget - Exit Status