當命令提示使用者輸入時,如何將命令的輸出重新導向到檔案?

當命令提示使用者輸入時,如何將命令的輸出重新導向到檔案?

我有一個命令會提示使用者輸入一些內容,然後將結果輸出到終端。我輸入如下命令將輸出重定向到檔案:

$the_command > abc.txt

但這不起作用。問題是沒有提示,那些提示問題的文字輸出到abc.txt不是我想要的結果。

答案1

您的命令有效且正確地將輸出重定向到檔案abc.txt
問題是你的腳本如何詢問輸入數據你是如何運行該腳本的?
讓我們來看兩個例子:

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

如果您運行,/bin/bash Script1.sh > abc.txt您將不會在 tty 上看到“請輸入...”的問題。如果您從鍵盤給出預期的輸入,您將在文件中找到第 #2 行和第 #4 行的輸出abc.txt

如果運行,/bin/bash Script2.sh > abc.txt您將看到問題“輸入註釋”,但您將在文件中找到abc.txt僅第 7 行的輸出。

注意:如果您在子 shell 中執行 Script2,sh

(bash Script2.sh 2>&1)> abc.txt

您不會在 tty 上看到任何輸出,並且會在abc.txt文件中找到所有輸出。
如果你運行它

bash Script2.sh 2>ccc.txt 1>ddd.txt`

您將在 中找到標準輸出(第 7 行)ddd.txt和標準錯誤(第 6 行)ccc.txt


如果你想僅重定向部分命令輸出你必須修改你的腳本。
實現此目的的方法之一是創建一個函數,在其中移動腳本中將產生有趣輸出的部分(見下文)。然後你可以從主要部分您的腳本(最初是您移入函數中的程式碼)僅將該輸出重定向到日誌檔案:

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "$@" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "$@" >> abc.txt  # this to append that part in the file
 # ...

你甚至應該發現有用的tee

將輸出重定向到多個文件,將標準輸入複製到標準輸出以及作為參數給出的任何文件。

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

在這種情況下,您將在 tty 上獲得命令的正常輸出,但同時您將在日誌檔案中保存一份副本abc.txt。如果您read -p像 script2 中那樣使用調用,那麼您的情況應該會很舒服the_command | tee abc.txt

註釋與參考文獻:

添加"$@"即可透過所有論證將腳本新增到函數中。

您可能會發現從網路上的許多來源閱讀有關 bashredirection 的更多資訊很有趣。

答案2

預設情況下,僅STDOUT重定向和/或透過管道傳輸。你想要的是不去管STDOUT它,並透過重定向傳遞任何內容STDIN

如果可以選擇編輯the_command,您可以確保將問題輸出到STDERR(無論任何重定向如何,都應該將其轉儲到螢幕),然後讓它回顯用戶通過STDOUT.

答案3

通常有 2 個重要的輸出管道:(STDOUT用於常規輸出)和STDERR(用於錯誤訊息)。

這裡的問題是,命令的「常規」輸出和提示文字都寫入到STDOUT,因此它們總是放在同一位置。當您使用重定向時,它只需要整個STDOUT,包括提示。

如果重寫(如 Jarmund 的另一個答案中所建議的)命令是不可能的,也許該命令有一個附加的選項/標誌(如--output),可以指定一些輸出檔案而不是使用重定向?

相關內容