![]() |
![]() |
![]() |
![]() |
![]() |
$ ls -F /etc | grep '/$' ←列出目錄但不列出檔案(常用) $ ls -F /etc | grep -v '/$' | less ←列出檔案但不列出目錄再經管線到 less $ cat file | more ←輸出檔案到翻頁閱讀器 $ echo abcd | tr [:lower:] [:upper:] ←輸出經管線到 tr 改大寫輸出 |
$ echo -n 'Linux' | od -An -tx1 ←以十六進制列出字串〝Linux〞的 ASCII 碼 4c 69 6e 75 78 |
$ cat /etc/passwd | grep '/home' | cut -d: -f1 | sort aaa bbb john austin |
輸入 | 程式 | 輸出 | ||
fd 0,stdin (standard input) | → | programs | → | fd 1,stdout (standard output) |
→ | fd 2,stderr (standard error) |
符號 | 動作 |
1> 或 > | 標準輸出重定向,因標準輸出(stdout)的 File Descriptor 原本就是1,故〝1〞可省略 |
1>> 或 >> | 標準輸出累加重定向 |
2> | 錯誤輸出(stderr)重定向 |
2>> | 錯誤輸出累加重定向 |
0< 或 < | 標準輸入重定向,因標準輸入(stdin) 的 fd 原本就是0,故〝0〞可省略 |
- | 標準輸入 |
2>&1 | stderr 重定向 stdout |
1>&2 或 >&2 | stdout 重定向 stderr |
<< STRING | 結束的輸入字串 |
$ echo 'Hello World' 1> redir.txt ←將原輸出至螢幕輸往檔案〝redir.txt〞 $ cat redir.txt ←驗證一下剛用重定向產生的檔案 (如原本不存在此檔,會建立此一檔案) Hello World $ echo '123' > redir.txt ←覆蓋舊檔〝redir.txt〞 (〝>〞=〝1>〞為省略 fd Number) $ cat redir.txt ←驗證一下〝redir.txt〞有無被覆蓋 123 |
$ echo '123' > redir1.txt $ echo '456' > redir2.txt $ cat redir1.txt redir2.txt > redir3.txt $ cat redir3.txt 123 456 |
$ cat > redir.txt↵ Enter ←從鍵盤讀取資料後重定向到檔案〝redir.txt〞 Linux is a PC OS↵ Enter ←可任意輸入文字 which is based on free and open source .↵ Enter Ctrl+D ←按<Ctrl+D> 檔案結束 $ cat redir.txt ←驗證一下 Linux is a PC OS which is based on free and open source . |
$ echo '123' 1>> acc_redir.txt ←累加重定向,如原無〝acc_redir.txt〞會建立此檔 $ echo '456' >> acc_redir.txt ←如原檔案已存在,不會覆蓋舊檔,而是把新資料加在舊檔之後 $ echo '789' >> acc_redir.txt $ cat acc_redir.txt ←驗證一下累加重定向累加後的檔案 123 456 789 |
$ ls -R /home ←以非〝root〞身份登入,將目錄 /home 內的檔案一一列出 中間輸出略 ls: cannot open directory /home/bbb: Permission denied ←權限不足,無法偷窺別入的家目錄(此為 stderr 部分) $ ls -R /home 2> stderr.txt ←將 stderr 部分重定向到檔案〝stderr.txt〞 (即正確部分的 stdout 輸往螢幕,但 stderr 部分已不會輸往螢幕,而是輸往檔案〝stderr.txt〞) $ cat stderr.txt ←驗證一下檔案〝stderr.txt〞 ls: cannot open directory /home/bbb: Permission denied |
$ ls -R /home > ok.txt 2> err.txt ←將 stdout 輸往〝ok.txt〞,stderr 輸往〝err.txt〞(因兩者都輸往到檔案,故螢幕不會有任何輸出了 |
$ ls -R /home 2> /dev/null ←螢幕只顯示正確的輸出(stdout),不正確的錯誤輸出 stderr 不要顯示,就往無底洞〝/dev/null〞 丟 $ ls -R /home 1> /dev/null ←和上例相反,螢幕只顯示錯誤部分 $ find / -name 'readme.*' 2> /dev/null ←找硬碟內叫 readme 的檔案 /usr/share/doc/words-3.0/readme.txt /usr/share/doc/lua-5.1.4/readme.html /usr/share/doc/marisa-0.2.4/readme.en.html |
$ echo 'abcd' > lower.txt ←產生一檔案〝lower.txt〞,檔案內容為〝abcd〞 $ tr -d 'c' < lower.txt ←用 tr 過濾程式把輸入的檔案中的字元〝c〞過濾掉 abd ←〝c〞不見了 $ tr a-z A-Z <lower.txt> upper.txt ←還可把輸入重定向的結果再重定向到檔案 $ cat < upper.txt ←用 cat 和重定向讀取檔案〝upper.txt〞 ABCD |
$ tr a-z A-Z <<< 'abc' ←把小寫的字串用 tr 來轉大寫 ABC |
$ echo '123' > redir.txt ←產生一檔案〝redir.txt〞,檔案內容為〝123〞 $ cat >> redir.txt - ←用標準輸入〝-〞(鍵盤輸入)累加重定向到檔案〝redir.txt〞 456↵ Enter ←由鍵盤輸入〝456〞再按 <Enter> 789↵ Enter ←由鍵盤輸入〝789〞再按 <Enter> Ctrl+D ←按<Ctrl+D> 檔案結束 $ cat redir.txt ←查看輸出結果 123 456 789 $ sort - ←由標準輸入(鍵盤)輸入來排序 z↵ Enter ←由鍵盤輸入〝z〞再按 <Enter> a↵ Enter ←由鍵盤輸入〝a〞再按 <Enter> Ctrl+D ←按<Ctrl+D> 檔案結束 a ←下為排序後的輸出 z $ awk '{print $1+$2}' - ←輸入兩個數字相加 1.23 4.56789 ←任意輸入兩個數字 5.7978 ←輸出兩個數字相加結果 (按 <Ctrl-D> 來結束) |
$ echo "wxyZ" | cat - ←cat 要列出檔案的內容來自標準輸入,而標準輸入來自管線 wyyz $ cat file3 | cat file1 - file2 ←此例輸出檔案順序為 file1,標準輸入(file3)再來為 file2 $ cat file2 | diff - file1 ←用指令 diff 比較〝file1〞和〝file2〞 |
$ ls -l /etc/cron.d /etc/fstab 2>&1 | tr a-z A-Z ←把 stdout & stderr 都經管線到 tr 改大寫 -RW-R--R-- 1 ROOT ROOT 608 2014-09-26 15:47 /ETC/FSTAB LS: CANNOT OPEN DIRECTORY /ETC/CRON.D: PERMISSION DENIED $ ls -l /etc/cron.d /etc/fstab 2>&1 1>/dev/null | tr a-z A-Z ←只把 stderr 經管線到 tr 改大寫 LS: CANNOT OPEN DIRECTORY /ETC/CRON.D: PERMISSION DENIED |
$ ls -R /home > redir.txt ←把 stdout(正確部分)輸往檔案,但錯誤部分的 stderr 沒輸往檔案而是輸往螢幕 ls: cannot open directory /home/jhon: Permission denied $ ls -R /home 1> redir.txt 2>&1 ←把原要顯示在螢幕的正確訊息(stdout)和錯誤訊息(stderr)全輸往到檔案,螢幕就不會有輸出了(自行用〝cat redir.txt〞驗證一下檔案內容) $ ls -R /home 2> redir.txt 2>&1 ←把原要輸往到檔案的錯誤訊息(stderr)和也輸往螢幕(stdout & stderr 全輸往螢幕,故檔案內容是空的) |
$ ls -R /home 2> redir.txt 1>&2 ←此例結果同上例的〝ls -R /home > redir.txt 2>&1〞(自行想一下原因) $ find / -name '*readme.txt' 1>&2 2>/dev/null ←〝1>&2〞 把 stdout 和 stderr 皆重定向到 stderr 但〝2>/dev/null〞 又把 stderr 輸往 null,故輸往螢幕只剩 stdout |
$ cat << 'EXIT' > redir.txt ←從鍵盤讀取資料後輸往檔案〝redir.txt〞(輸入〝EXIT〞後自動結束,結束的輸入字串可自行定義) > Android's kernel is derived↵ Enter ←任意輸入文字按 <Enter> > from the Linux kernel.↵ Enter > EXIT↵ Enter ←符合自行定義的結束字串〝EXIT〞再按 <Enter> 會停止輸入 $ cat redir.txt ←驗證一下 Android's kernel is derived from the Linux kernel. $ cat > redir.txt << 'EXIT' ←此例同上,但非標準語法 |
語法: read_from_stdout | tee [-otpiton] file | ||
指令名稱/功能/命令使用者 | 選項 | 功能 |
tee/ (pipe tee) T型管線/ Any |
-a | 輸出累加重定向 |
-i | 忽略中斷 |
$ echo 'Hello World' | tee tee_file.txt ←把原只輸出到螢幕用T型管線 tee 同時分流向檔案(螢幕和檔案都有輸出) Hello World ←螢幕的輸出 $ cat tee_file.txt ←驗證一下用 tee 分流出來的檔案 Hello World |
$ man tee | tee -a file1 file2 file3 ←tee 可一次分流出多個檔案 |
$ cd ~root ←進入 root 的家目錄 bash: cd: /root: Permission denied ←許可拒絕 (有錯誤產生) $ echo $? ←查看剛的指令傳回值 1 ←非 0 表示程式執行有誤 $ cd ~ ←進入自己的家目錄 $ echo $? ←查看剛的指令傳回值 0 ←為 0 表示程式執行正確 |
# cd /root && mv /root/fileA /root/fileB && clear ←如執行〝cd〞無誤則再執行〝mv〞如再如誤誤則執行〝clear〞 |
$ cat /etc/man.conf || cat /etc/man.config ←如〝cat /etc/man.conf〞 有誤則執行〝cat /etc/man.config〞 |
$ [ -f fileA ] && [ -f fileB ] && echo "exist" || echo "Not found" ←如第一個指令結果不正常〝&&〞後的指令都不會被執行而是執行〝||〞後面的指令 |