bash脚本没有完成

时间:2013-09-15 17:12:22

标签: bash shell wget exitstatus

我正在尝试按照以下说明为Dash生成docsets:http://kapeli.com/docsets。 问题是,脚本在wget之后不会继续,并且不会抛出任何错误。当我将脚本复制到终端时,一切正常。

我正在使用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工作,很好,但感觉不对。

4 个答案:

答案 0 :(得分:1)

<强>更新

我原来的答案是对你的问题的误解。这似乎是个问题的一个问题是:

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

这里不确定。但似乎您可能想要制作indexGuide字符串,如下所示:

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

答案 1 :(得分:1)

您启用了set -e。如果其中一个命令返回非零退出代码,则您的脚本将退出。有些人会在没有消息的情况下结束。

要知道导致问题的命令,请使用-x运行脚本:

bash -x script.sh

或者在它之前添加set -x:

set -x
set -e

答案 2 :(得分: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

不太容易引用错误

答案 3 :(得分:1)

wget的退出状态8表示对于其中一个文件服务器返回错误(例如404):

  

服务器发出了错误响应。

您可能想要修改网址,因此他们指向正确的网址,或忽略wget的退出状态,例如

wget ... || true

注意:除非您启用了pipefail选项,否则上述内容将有效。

其他方式是比较退出状态,并在返回8时忽略,例如:

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

请参阅:{{3}}