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 -eakaを有効にしまし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

アップデート

私の最初の答えは、あなたの質問の誤解でした。それが問題であると思われる1つの問題はあなたです:

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

ここではわかりません。しかし、次のように文字列を作成indexしたい場合があるようです。Guide

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 に答える
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 に答える