[英]Shell script - Output to both the terminal and a log file in a sub-shell
我有一些旨在協同工作的 shell 腳本。 第一個腳本 (script1.sh) 調用子 shell 中的下一個腳本。 第二個腳本 (script2.sh) 需要“返回”一些東西供第一個腳本使用。 我需要在第二個腳本中回顯的最后一行。 但是,當我以這種方式使用它時,第二個腳本中通過 echo 的任何輸出都不會輸出到終端。 我希望第一個和第二個(以及第三個和第四個,...)的所有輸出都輸出到終端,但也寫入日志文件。
腳本1.sh:
#!/bin/sh
func_one() {
RESULT=$(./script2.sh | tail -1)
echo "RESULT: $RESULT"
}
func_one | tee log_file.log
腳本2.sh:
#!/bin/sh
echo "Hello"
echo "World!"
嘗試 1 輸出:
$ ./script1.sh
RESULT: World!
$
log_file.log 內容:
RESULT: World!
如果我嘗試在第二個腳本中重定向輸出,則它會輸出到終端,但不會輸出到日志文件:
腳本2.sh:
#!/bin/sh
echo "Hello" >&2
echo "World!" >&2
嘗試 2 輸出:
$ ./script1.sh
Hello
World!
RESULT:
log_file.log 內容:
RESULT:
我還嘗試在腳本 1 的同一行輸出到終端和 tee:
func_one >&2 | tee log_file.log
但這給出了與第一次嘗試相同的結果。
我想要的是將兩個輸出都輸出到終端並寫入 .log 文件:(如果它工作正常)
$ ./script1.sh
Hello
World!
RESULT: World!
$
log_file.log 內容:
Hello
World!
RESULT: World!
我怎樣才能得到這個結果? 此外,最好不要使用 bash,因為我們將要運行的一些機器沒有 bash。
我在這里看過: 如何讓 STDOUT 和 STDERR 都轉到終端和日志文件? 但這對我來說沒有幫助。
為了在不干擾script1.sh的工作的情況下將script2.sh的所有輸出發送到終端,試試對script1.sh的這個修改:
$ cat script1.sh
#!/bin/bash
func_one() {
RESULT=$(./script2.sh | tee >(cat >&2) | tail -1)
echo "RESULT: $RESULT"
}
func_one | tee log_file.log
在這里,第一個 tee 命令確保所有script2.sh
輸出都通過 stderr 出現在終端上。 為此,需要進程替換(而這又需要從sh
升級到bash
)。
輸出是:
$ ./script1.sh
Hello
World!
RESULT: World!
這與上面的相同,只是我們不接觸 stderr(您可能希望保留該錯誤)。 在這里,我們創建了一個額外的文件描述符3
來復制標准輸出:
#!/bin/bash
exec 3>&1
func_one() {
RESULT=$(./script2.sh | tee >(cat >&3) | tail -1)
echo "RESULT: $RESULT"
}
func_one | tee log_file.log
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.