0

bash ファイルs.shには、実行するコマンドを渡す Executor 関数があります。コマンドが期待どおりに機能しない場合、この関数はそのコマンドを出力します。

Executor()
{
    if ! $*
    then
        echo "$*"
        exit 2
    fi
}

今、私はこの関数を呼び出しています -

Executor clangPath="Hello" make(これは、makefile で clangPath 変数の値を「Hello」として設定するために使用されます)

これによりエラーが発生しました -

./s.sh: line 5: clangPath=Hello: command not found
[./s.sh] Error: clangPath=Hello make

ただし、このように同じコマンドを実行すると正常に動作します

if ! clangPath="Hello" make
then
    echo "HelloWorld!"
fi

エラーを見て、文字列の引用符に間違いがあるのではないかと思ったので、試してみました

exitIfFail clangPath='"Hello"' make

これでもエラーになりました-

./s.sh: line 5: clangPath="Hello": command not found
[./s.sh] Error: clangPath="Hello" make

エラーの原因は何ですか?

4

1 に答える 1

1

関数の目的が Bash 式を実行することである場合、エラー メッセージを出力します。式が失敗した場合 (ゼロ以外のステータスが返された場合)、次の方法でこれを実装する方法がありますeval

#!/bin/bash -

function Executor()
{
  eval "$@"

  if [ $? -ne 0 ]
  then
    echo >&2 "Failed to execute command: $@"
    exit 2
  fi
}

この$?変数は、以前に実行されたコマンドの終了ステータスを保持します。したがって、ゼロでないかどうかを確認します。

また、エラー メッセージを標準エラー記述子にリダイレクトする方法にも注意してください。

使用法:

Executor ls -lh /tmp/unknown-something
ls: cannot access /tmp/unknown-something: No such file or directory
Failed to execute command: ls -lh /tmp/unknown-something


Executor ls -lh /tmp
# some file listing here...

$@変数は、物事自体を解釈するため、ここではより適切ですeval$*および$@を参照してください。

于 2016-09-30T11:16:27.450 に答える