
我有一個命令會提示使用者輸入一些內容,然後將結果輸出到終端。我輸入如下命令將輸出重定向到檔案:
$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 的更多資訊很有趣。
- 正如建議的史考特在他的評論中有一個Unix SE 的 wiki 答案: 一個好的起點。
- A 必須是
man bash
或bash 手冊。 - 我發現重定向章節很有用bash駭客您可以在哪裡找到鏈接過時的用途也。
- 您可以參考進階 Bash 腳本指南,也是第20章。
答案2
預設情況下,僅STDOUT
重定向和/或透過管道傳輸。你想要的是不去管STDOUT
它,並透過重定向傳遞任何內容STDIN
。
如果可以選擇編輯the_command
,您可以確保將問題輸出到STDERR
(無論任何重定向如何,都應該將其轉儲到螢幕),然後讓它回顯用戶通過STDOUT
.
答案3
通常有 2 個重要的輸出管道:(STDOUT
用於常規輸出)和STDERR
(用於錯誤訊息)。
這裡的問題是,命令的「常規」輸出和提示文字都寫入到STDOUT
,因此它們總是放在同一位置。當您使用重定向時,它只需要整個STDOUT
,包括提示。
如果重寫(如 Jarmund 的另一個答案中所建議的)命令是不可能的,也許該命令有一個附加的選項/標誌(如--output
),可以指定一些輸出檔案而不是使用重定向?