簡體   English   中英

如何在POSIX shell中測試命令輸出是否為非空?

[英]How to test whether a command output is non-empty in POSIX shell?

如何有效地檢查任意命令是否在POSIX shell中產生任何輸出? (比方說git ls-files --killed 。)

有三種顯而易見的方式,但每種方式對我來說都是丑陋或邪惡的:

  1. [-n“$(git ls-files --killed)”] - 命令的完整輸出必須在內存中捕獲並傳遞給測試 (至少希望是內置的)
  2. [“$(git ls-files --killed | wc -c)” - GB 0] - 涉及兩個fork-execs
  3. TMP = $(臨時文件); git ls-files --killed>“$ tempfile”; [-s“$ tempfile”] && ...; rm“$ tempfile” - 一個中間臨時文件(同樣捕獲所有輸出)也是必需的

您也可以檢查命令的退出狀態。 通常,如果成功運行命令,則返回退出狀態0。

git ls-files --killed > /dev/null
if [ $? -eq 0 ]

或者,如果您只想依賴命令的輸出,您可以使用“ head -1 ”和第一個選項,因為無論如何它看起來除了知道結果之外,您沒有使用命令輸出進行任何處理。

我的首選解決方案使用POSIX shell內置read

if git ls-files --killed | read REPLY; then
  echo "Some output"
else
  echo "No output or git failed"
fi

read嘗試從stdin(和變量REPLY )讀取一行,如果成功則返回0,如果失敗則返回正退出代碼。 管道的其余部分未讀取。 僅在bash中,如果省略則REPLY是默認名稱,因此read REPLY可以縮短為read

這種方法的潛在缺點是不檢查所討論程序的退出代碼(在您的示例中為git)。

您可能認為此解決方案與其他解決方案一樣,但我認為它使用的內存少於其他解決方案(我不是shell腳本效率方面的專家)。

代碼只是bash:

z=0
while read -r -n1 char; do
  z=1
  break
done < <(git ls-files --killed)
[ $z != 0 ]

它使用臨時變量而不是臨時文件,我認為read一次只能運行一個char,但git ls-files命令仍然可以完全執行。

它可能不會那么難看,但我認為它可能至少更有效率。

因為你提到POSIX,我會推薦你​​這個答案
我會使用/ usr / bin / test,因為它在POSIX系統上是必需的。

/usr/bin/test -n "$(git ls-files --killed)"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM