亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將stdout捕獲到變量,但仍將其顯示在控制臺中

將stdout捕獲到變量,但仍將其顯示在控制臺中

qq_笑_17 2019-12-27 10:44:03
我有一個bash腳本,它調用了幾個長時間運行的進程。由于處理原因,我想將這些調用的輸出捕獲到變量中。但是,由于這些進程是長期運行的進程,因此我希望rsync調用的輸出實時顯示在控制臺中,而不是事后顯示。為此,我找到了一種方法,但是它依賴于將文本輸出到/ dev / stderr。我覺得輸出到/ dev / stderr并不是一個好方法。VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee /dev/stderr)VAR2=$(rsync -r -t --out-format='%n%L' --delete -s /path/source1/ /path/target1 | tee /dev/stderr)VAR3=$(rsync -r -t --out-format='%n%L' --delete -s /path/source2/ /path/target2 | tee /dev/stderr)在上面的示例中,我多次調用rsync,并且希望在處理文件時看到它們的名稱,但是最后我仍然希望將輸出結果包含在變量中,因為稍后將對其進行解析。有沒有一種“更清潔”的方式來實現這一目標?如果有所作為,我正在使用Ubuntu 12.04,bash 4.2.24。
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

在您的shell中復制&1(在我的示例中為5),在子shell中使用&5(這樣您將寫入父shell的stdout(&1)):


exec 5>&1

FF=$(echo aaa|tee >(cat - >&5))

echo $FF

將打印aaa兩次,一次是由于子外殼中的回顯,而第二次將打印變量的值。


在您的代碼中:


exec 5>&1

VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee >(cat - >&5))

# use the value of VAR1


查看完整回答
反對 回復 2019-12-27
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

Op De Cirkel的答案具有正確的想法??梢赃M一步簡化(避免使用cat):


exec 5>&1

FF=$(echo aaa|tee /dev/fd/5)

echo $FF


查看完整回答
反對 回復 2019-12-27
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

這是捕獲stderr命令和出口代碼的示例。這是基于羅素·戴維斯(Russell Davis)的答案。


exec 5>&1

FF=$(ls /taco/ 2>&1 |tee /dev/fd/5; exit ${PIPESTATUS[0]})

exit_code=$?

echo "$FF"

echo "Exit Code: $exit_code"

如果該文件夾/taco/存在,它將捕獲其內容。如果該文件夾不存在,它將捕獲一條錯誤消息,并且退出代碼為2。


如果省略,2>&1則只會stdout被捕獲。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 908 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號