BASH的管線與重導向


cmd >file          # stdout導出檔案
cmd 1>file         # stdout導出檔案
cmd 2>file         # stderr導出檔案
cmd >file 2>&1     # stdout&stderr都放到file中
cmd >file 2>file2  # stdout到file;stderr到file2
cmd >>file         # stdout加到檔案後
cmd 1>>file        # stdout加到檔案後
cmd 2>>file        # stderr加到檔案後
cmd >>file 2>&1    # stdout和stderr都加到檔案後
cmd <input_file       # stdin輸入指定檔案
cmd 3<input_file       # 輸入指定檔案到指定的fd, 這裡是指定fd=3
cmd <<LABEL        # 開啟可讓使用者輸入的stdin, 並以LABEL來結尾。要使用這個寫法, cmd需要能夠讀入stdin的輸入
cmd1 | cmd2        # cmd1的stdout導入cmd2
cmd1 2>&1 | cmd2   # cmd1的stdout和stderr導入cmd2


cmd1 | cmd2 | cmd3 > file1     # 串聯指令的執行
cmd1 | tee file_cmd1 | cmd2 | cmd3 > file1     # 將cmd1的輸出順便導入file_cmd1

重導注意事項
重導向時,如果用到2>&1和1>&2需注意要輸出的檔案要寫再前面,因為bash實作管線導向時,是close原本變數中的fd,再dup另一個fd接上該變數。

如果寫的指令為
cmd 2>&1 > log.txt # 與預想結果不同的寫法

拆解成BASH細部作法時就會是
close(fd_2);
fd_2 = dup(fd_1);

close(fd_1);
fd_1 = open("log.txt");

exec("cmd");
因此不會如原本預想的,把錯誤輸出(stderr)的所有輸出內容,丟到標準輸出(stdout),再輸出到log.txt檔案中

要把指令改成,才會是正確的
cmd >log.txt 2>&1 


特殊的檔案輸入方式
BASH下面這種寫法,看起來好像很神奇,實際上只要把一些空白和順序掉換就可以理解
cat  <<EOF>  output 

等同於下面這個寫法
cat > output << "EOF"




而且"EOF"這串字是可以改成任意字串的,只是使用者輸入要結束時輸入的字串就要一起改變。


注意!! 用這個方法的時候,內文若有$(xxxxx)會代換成bash變數和指令


留言