2

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

我使用的是 MacOS 10.8.4 和默认的 bash。

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

mkdir -p $1.docset/Contents/Resources/Documents/

echo "THIS RUNS"
wget -rkp -l3 -np -nH --cut-dirs=1 --directory-prefix="./"$1".docset/Contents/Resources/Documents/" $2
echo "THIS DOES NOT RUN"

sed "s/NAME/$1/g" template > $1.docset/Contents/Info.plist
touch $1.docset/Contents/Resources/docSet.dsidx
# (script continues) 

我查看了其他帖子,例如My shell script stop after exec但我没有exec在这里使用。

为什么脚本会退出?

4

4 回答 4

4

您启用set -e了 aka errexit

如果其中一个命令返回非零退出代码,您的脚本将退出,并且可能并不总是很明显哪个命令具体失败:

  • 有些人可能会打印一个有用的错误来识别自己和问题
  • 一些(如wget)可能会在多页输出中简要提及错误方式
  • 有些(如grep)可能根本不显示错误或任何输出,脚本只是退出

要知道哪个命令导致问题,请使用-xaka运行脚本xtrace

bash -x script.sh

或者添加set -x到脚本本身:

set -x
set -e
...

这将导致脚本打印出正在执行的每个命令,因此您可以看到哪个是最后一个。

如果您想忽略命令的退出状态,可以添加|| true

# Causes exit if you lack read permission on any directory
find . -name '*.sh' 

# Does not cause the script to exit
find . -name '*.sh' || true

如果您希望set -e在脚本中触发时收到警报,您可以设置一个陷阱:

#!/bin/bash
set -e
# Show error if commands exit with non-zero
trap 'ret=$?; echo "$0:$LINENO: Error: set -e triggered"; exit $ret' ERR
# Would have failed silently
grep doesnotexist /etc/passwd
echo "This does not run"

执行时:

$ ./foo
./foo:6: Error: set -e triggered
于 2013-09-15T17:35:07.527 回答
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

它不太容易出现引用错误

于 2013-09-15T17:35:57.440 回答
1

更新

我最初的回答是对你的问题的误解。一个似乎是问题的问题是您的:

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

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

INSERT INTO searchIndex (name, type, path) VALUES ('index', 'Guide', 'index.html');
于 2013-09-15T17:19:59.527 回答
1

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

服务器发出错误响应。

您可能想要修复 URL,使它们指向正确的 URL,或者忽略 的退出状态wget,例如

wget ... || true

注意:除非您pipefail启用了该选项,否则以上将起作用。

另一种方法是比较退出状态并在返回 8 时忽略,例如:

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

请参阅:Wget - 退出状态

于 2016-04-04T01:45:01.327 回答