2017-05-05 24 views
1

我有一個foobar命令,始終是冗長和我想顯示其輸出(stdout和stderr),以僅當foobar的退出代碼是錯誤代碼控制檯。如何使用shell管道基礎上,退出代碼有條件地顯示輸出?

我想要實現這個而不輸出保存到臨時文件。我已經知道該解決方法,但我不想生成新文件。

這暗示這樣的解決方案的缺點是,只有當foobar的結束整個輸出可以看出,因爲只有那麼我們就會知道,如果它是成功還是失敗。

+0

你能給一個代碼示例嗎? – 123

+1

也有你不能使用文件的原因嗎? – 123

+0

這不是一種解決方法;這是你必須做的。 shell不會以任何其他方式緩衝輸出。 – chepner

回答

4

你可以試試只是將輸出保存在一個變量中。一個簡單的一行將是:

r=$(foobar 2>&1) || echo "$r"

+0

我發現這一個重要的缺點,使用這種方法,當我失去它,我不希望ANSI着色。 – sorin

+0

@sorin ANSI代碼應該可以正常工作,並且它們在我的測試中執行。 'R = $(printf的 「\\ 033 [33mHello \\ 033 [39米\ n」 個;出口1)|| echo「$ r」'在我的終端上以黃色打印「Hello」。回聲不會解釋轉義序列,但如果您直接運行時獲取顏色,foobar命令應該這樣做。 – ccarton

+0

的確,我只需要強制使用它,但是這對於任何包裝都是必需的。我最終實現了您的解決方案,無需外部工具。 – sorin

1

你可能想的chronic實用程序:

慢性運行一個命令,並安排它的標準輸出和標準錯誤如果命令失敗,只顯示(非零退出或崩潰)。如果命令成功,則任何無關的輸出都將被隱藏。

可用性:

  • apt-get install moreutils在Debian/Ubuntu的
  • brew install moreutils在MacOS(OSX)
  • yum install moreutils在RHEL(EPEL)/ Fedora的/ CentOS的
相關問題