2

ログインに使用するかなり複雑なスクリプトがあります。

`/Users/tinosino/.profile`

シェルスクリプト言語: Bash

問題を見つけた場合にバグ修正をリクエストする以外に、ログイン スクリプトを変更することはできません。

最近ログインするたびに、これを実行すると:

echo $?

すぐに、私は得る:

1

スクリプトで何かが失敗しています。

エラーの原因を特定するにはどうすればよいですか? そのエラー コードを返す正確な行は? 特定の終了コードを「トラップ」し、トラップをオンにして.profile、その時点でスクリプトを中止することは可能ですか?

-x を指定して Bash を実行することは知っていますが、出力は完全に圧倒されます: 複雑なスクリプト、数千行。

  • どういうわけかそれを「停止」して、1返されたときに制御できるようにすることはできますか?
  • 代わり$?に、終了コードが表示されるように、犯人のコマンドラインを表示することはできますか?

を見てhistory$HISTFILEあまり役に立ちませんでした。複雑すぎる。

この種のエラーをトラップすることは、将来的には「一般的に役立つ」ことさえあると思います。たぶん他のユーザーにも?

4

3 に答える 3

1

はい、トラップすることは可能ですが、真剣に言えば、出力が複雑すぎて圧倒されると考える場合は、おそらくそれを追跡するのに適した人物ではありません.

OK、選択肢がないとしましょう。まず、腕を宙に投げて、何かが複雑すぎると言ってはいけません。誰かがそれを書きましたが、彼らはあなたと同じくらい頭がいいと思います. 複雑なコードは簡単に記述できます。

第二に、エラーがあることをどうやって知るのですか? $?1 であることは必ずしもエラーではなく、条件が false であることによって設定される可能性があり、それは予想されることです。

そのため、エラー時に実行を停止する方法があります。スクリプトを実行するときは、bash -e script-name. それは悪い習慣として一般的に嫌われていますが、あなたは必死に聞こえます! 条件文の失敗で停​​止することはありません。

于 2013-03-14T17:17:29.700 に答える
0

sourceシェルプロファイルは、実行される代わりに実行される通常のシェルスクリプトです。違いは次のmanページで説明されています。

source filename [arguments]
  Read  and  execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.

したがって、コマンドラインからシェルスクリプトを実行するのと同じように、ソースプロファイルの終了コードは、プロファイルで最後に実行されたコマンドの終了コードです。したがって、/Users/tinosino/.profileコマンドプロンプトが表示される前に、それが最後のプロファイルであることが確実な場合、終了コード1は、そのファイルで実行された最後のコマンドから取得されます。したがって、探す必要があるのはexit、そのファイルに呼び出されたポイントと、そのファイルの最後のコマンドだけです。

于 2013-03-14T18:34:28.723 に答える
0

デバッグ用に strace を使用してコマンドを実行することもできます。システムコールと受信信号に関する情報が表示されます。

http://en.wikipedia.org/wiki/Strace

于 2013-03-14T17:32:44.247 に答える