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"這串字是可以改成任意字串的,只是使用者輸入要結束時輸入的字串就要一起改變。
留言