簡體   English   中英

Shell 腳本 - 輸出到終端和子 shell 中的日志文件

[英]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.

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