假設我有一個在我的腳本中運行的命令,stderr它是我需要的第一行。我正在使用stderr,因為stdout它已經被用于傳輸其他一些資料。我仍然需要用戶反饋的其余部分stderr,所以我仍然想在第一行之后顯示所有內容。
cmd() {
ssh [email protected] '
printf "stderr data line 1 (important)\n" 1>&2
printf "stdout data line 1\n"
printf "stderr data line 2\n" 1>&2
printf "stdout data line 2\n"
printf "stdout data line 3\n"
printf "stderr data line 3\n" 1>&2'
}
# What sort of shell magic would I need to extract
# only the 1st line of stderr?
cmd > store_stdout_to_this_file ??? read -a first_line_of_stderr
echo "$first_line_of_stderr"
我不能使用管道,因為管道僅通過管道傳輸 stdout,即使我要重新排列它們,管道的另一端也會位于不同的行程空間中。
uj5u.com熱心網友回復:
我看到有幾種方法可以做到這一點,但都有不同的局限性和怪異之處。可能最簡單的方法是將 stderr 重定向到運行read一次的后臺子 shell(通過行程替換),然后cat:
cmd >outputfile 2> >(read firstline; echo "First line is: '$firstline'"; cat -u)
但這會將一線處理置于子 shell 中,因此當該 shell 退出時,它設定的任何變數都將丟失。我想你可以讓它將該行寫入另一個檔案,然后從主腳本中讀取它......
另一種可能性是將您嘗試捕獲的命令放在行程替換和read主catshell 中:
{ read firstline; cat -u; } < <(cmd 2>&1 >outputfile)
echo "First line is: '$firstline'"
請注意,輸出重定向cmd必須在行程替換部分內完成(因為它的標準輸出被發送到read-cat部分),并且2>&1必須首先出現,這樣 stderr 就不會到達同一個地方。
uj5u.com熱心網友回復:
你可以這樣做:
line=
while read -r; do
[[ -z $line ]] && line="$REPLY" || echo "$REPLY"
done < <(cmd 2>&1 >out.log)
stderr data line 2
stderr data line 3
# check $line
echo "$line"
stderr data line 1 (important)
即首先將 stderr 重定向到 stdout,然后將 stdout 重定向到out.log最后使用管道輸出head -n 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536800.html
標籤:狂欢管道标准错误
