[解決済み] Golang で exec.Command を実行したときの "exit status 1" エラーをデバッグする方法
2022-02-10 19:30:05
質問
以下のコードを実行すると
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Result: " + out.String())
このエラーが発生します。
終了ステータス 1
しかし、これではエラーの正確な原因をデバッグするのに役立ちません。
より詳細な情報を得るには?
解決するには?
解決策としては
Stderr
プロパティを使用します。これは、次のようにできます。
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
fmt.Println("Result: " + out.String())
上記のコードを実行すると、何が問題なのかが明確になります。
<ブロッククオート終了ステータス 1: find: -exec: 終了する ";" または "+" がありません。
編集してください。
上記のコードでは、エラーが発生した場合、メッセージが標準エラー出力され、コマンドは0以外のエラーコードを返すと想定しています。これは多かれ少なかれ標準的なことです。
しかし、@snorberhuis が後述するように、コマンドによってはエラーが stdout に出力されることがあります。他のコマンドでは、stderr に出力するがエラーコードは 0 を返すかもしれない(その場合
err
になります。
nil
). また、標準エラー出力にメッセージがあっても、必ずしもエラーとは限りません(ffmpegのツールではよくあることです)。
ですから、基本的には、あなたが期待するコマンドに対応するために、上記のコードを微調整する必要があるかもしれません。
関連
-
[解決済み] ベリログ・ノンネット値割り当て
-
[解決済み] Golang で exec.Command を実行したときの "exit status 1" エラーをデバッグする方法
-
[解決済み] VB6でVarTypeが返すvbErrorとは何ですか?
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み] Bashでパイプ出力と終了ステータスをキャプチャする
-
[解決済み] PHPはエラーログをどこに保存するのですか?(PHP 5, Apache, FastCGI, および cPanel)
-
[解決済み] node.jsで「Error: spawn ENOENT」をデバッグするにはどうすればよいですか?
-
[解決済み] Linuxの標準的な終了ステータスコードはありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン