發表文章

目前顯示的是 6月, 2022的文章

2>&1是什麼意思?介紹輸出重新導向

剛開始接觸shell腳本,看到指令後面接著「2>&1」感到茫然,孰悉輸出重新導向符號「>」,就不難理解,首先要介紹檔案描述符。 檔案描述符 檔案描述符共有3個,1個輸入,2個輸出,如下表 值 stdio.h 名稱 中譯 0 stdin Standar Input 標準輸入 1 stdout Standar Output 標準輸出 2 stderr Standar Error 標準錯誤輸出 將輸出文字記錄於檔案中 將文字記錄於檔案,普遍的寫法為 echo "standar output" > file.txt 其實在「>」前面省略了1,也就是標準輸出(stdout),完整的寫法應為 echo "standar output" 1> file.txt 檔案描述符1是預設值,通常省略不寫,而在「>」後有無空格都是符合語法的,可依個人程式風格自訂。 假設指令輸出有錯誤訊息,例如當前目錄沒有xxx這個檔案,用ls去列出xxx就會出錯,執行顯示為 $ ls xxx ls: cannot access 'xxx': No such file or directory 把標準錯誤輸出(stderr)記錄於檔案中,可寫作 ls xxx 2> file.txt 就可以將「ls: cannot access 'xxx': No such file or directory」存於file.txt。 另一種常見的應用,是想不顯示錯誤訊息,就把標準錯誤輸出丟進/dev/null。 ls xxx 2> /dev/null 導向檔案描述符 若想將「標準輸出」、「標準錯誤輸出」合併,一般的作法是將「標準錯誤輸出」併入「標準輸出」。但若寫為 ls xxx 2>...

tee指令:儲存且同時顯示於螢幕

圖片
tee tee就是指大寫「T」的形狀,左端輸出結果(stdout)進入,右端繼續處理,多了下端儲存至檔案。參考 維基百科 的示意圖 螢幕 & 檔案 想將執行結果儲存於檔案中,可使用「>」達到目的,例如: ls -l > file.txt 但這樣輸出文字就只傳送到file.txt,螢幕不會顯示,藉由tee指令可以讓螢幕同步顯示結果: ls -l | tee file.txt 若是想附加到文件之後 ls -l >> file.txt 螢幕同步顯示則加入參數「-a」 ls -l | tee -a file.txt 變數 & 螢幕 想將執行結果儲存於變數,例如: var=$(ls -l) 但這樣輸出文字螢幕也不會顯示,藉由tee指令讓輸出文字寫到/dev/tty,就可以讓螢幕顯示。 var=$(ls -l | tee /dev/tty) 或者使用「偽終端(/dev/pty/)」達成螢幕顯示的需求,可使用tty指令找到當前的偽終端。 my_tty=$(tty) var=$(ls -l | tee $my_tty)