命令行操作:邏輯運算符、重定向與管道
- 前言
- 一、邏輯運算符
- 1.1. 邏輯運算符 && (AND)
- 1.2. 邏輯運算符 || (OR)
- 1.3. 標準文件描述符 (FD)
- 二、重定向
- 2.1 重定向: > 與 >>
- 2.2 重定向錯誤輸出: 2>/ 與 2>>
- 2.3 POSIX 推薦(經常使用)
- 三、管道 (順便說明, 與重定向的區別)
- 結語
前言
??在日常的命令行操作中,我們經常會用到各種邏輯運算符、重定向和管道等高級功能。這些功能不僅能夠提高我們的工作效率,還能幫助我們更好地控制命令的執行流程和輸出結果。本文將詳細講解邏輯運算符(如 && 和 ||)、標準文件描述符(如 stdin、stdout 和 stderr)、重定向操作(如 >、>>、2> 和 2>>)以及管道的使用方法,并通過豐富的示例幫助讀者深入理解這些概念。
一、邏輯運算符
1.1. 邏輯運算符 && (AND)
??邏輯運算符 && 表示“僅當左側命令成功(退出狀態碼為 0)時才執行右側命令”。
示例:
false && echo "成功"
#沒有輸出,因為 false 失敗(退出碼非 0),所以右側不執行
true && echo "成功"
成功
#true 成功(退出碼 0),所以執行 echo
1.2. 邏輯運算符 || (OR)
??邏輯運算符 || 表示“僅當左側命令失敗(退出狀態碼非 0)時才執行右側命令”。
示例:
false || echo "左側失敗,執行此處"
#左側失敗,執行此處
true || echo "不會執行"
#沒有輸出,因為 true 成功,右側不執行
#組合注意: A && B || C 從左到右結合,等價于 (A && B) || C。
舉例:
false && echo yes || echo fallback
fallback
#(false && echo yes) 不成立,于是執行 || 后面的 echo fallback
1.3. 標準文件描述符 (FD)
- 0 = stdin (標準輸入)
- 1 = stdout (標準輸出)
- 2 = stderr (標準錯誤)
示例(分別演示 stdout/stderr):
echo "out"
out # 到 stdout
echo "err" >&2
err # 到 stderr
#如果只把 stdout 重定向到文件,但 stderr 不重定向,錯誤仍會顯示在終端:
ls /no/such/path > out.txt
#終端會顯示錯誤信息(stderr),out.txt 為空或不存在
二、重定向
2.1 重定向: > 與 >>
含義:
- > 把 stdout 寫到文件(覆蓋原內容)
- >> 把 stdout 追加到文件末尾
示例(覆蓋):
echo "first" > file.txt
echo "second" > file.txt
cat file.txt
second
示例(追加):
echo "first" > file.txt
echo "second" >> file.txt
cat file.txt
first
second
2.2 重定向錯誤輸出: 2>/ 與 2>>
含義: 把標準錯誤 (fd2) 重定向到文件(覆蓋或追加)。
示例:
ls /no/such/path 2> err.txt
cat err.txt
ls: cannot access '/no/such/path': No such file or directory
追加:
ls /no/such/path 2>> err.txt
新的錯誤會追加到 err.txt 后面
同時重定向 stdout 與 stderr
有幾種常用寫法(要注意兼容性與順序):
2.3 POSIX 推薦(經常使用)
[命令] > out.txt 2>&1
含義: 先把 stdout 重定向到 out.txt,再把 stderr (2) 重定向到當前 stdout (1) 指向的位置(也就是 out.txt)。結果:stdout 和 stderr 都寫入 out.txt。
示例:
bash -c 'echo out; echo err >&2' > both.txt 2>&1
cat both.txt
out
err
順序很重要,下面是常見坑:
bash -c 'echo out; echo err >&2' 2>&1 > both.txt
??這條會把 stderr 重定向到最初的 stdout (終端),然后再把 stdout 重定向到文件,結果是:錯誤仍打印到終端,而文件里只有 stdout 內容。
Bash 特殊簡寫 (bash/ksh/zsh)
[命令] &> file # 將 stdout 和 stderr 都寫入 file (Bash 特性)
[命令] |& other # 將 stdout + stderr 都送入管道 (bash/zsh 的簡寫)
示例 (&>):
bash -c 'echo out; echo err >&2' &> both.txt
cat both.txt
out err
將輸出丟棄 /dev/null
含義: 把不想要的輸出重定向到 /dev/null (黑洞)。
示例: 只保留 stderr,丟棄 stdout:
[命令] > /dev/null
丟棄 stderr:
[命令]> /dev/null
同時丟棄兩者:
[命令] > /dev/null 2>&1
或 (bash):
[命令] &> /dev/null
三、管道 (順便說明, 與重定向的區別)
??含義: 把前一個命令的 stdout 作為下一個命令的 stdin。默認只傳輸 stdout,不包含 stderr(除非你把 stderr 重定向到 stdout)。
示例:
echo -e "apple\nbanana" | grep banana
banana
如果想把 stderr 也通過管道傳給下一個命令,可以用:
[命令] 2>&1 | grep something
或 (bash):
[命令] |& grep something
例子: 把 stdout 和 stderr 都傳給 grep:
·```bash
bash -c ‘echo out; echo err >&2’ 2>&1 | sed -n ‘p’
out
err
高級: 自定義文件描述符 (常見技巧)
你可以用 exec 打開一個新的 FD,然后向它寫:
示例:
```bash
exec 3 > mylog.txt
echo "hello" >&3
exec 3>&-
cat mylog.txt
hello
(這是可選進階技巧,用于腳本中對多個日志流進行管理)
小結 (快速備忘)
- &&: 左成功 → 才執行右
- ||: 左失敗 → 才執行右
- > 覆蓋 stdout, >> 追加 stdout
- 2> 和 2>> 用于 stderr
- 將 stderr 指向 stdout: 2>&1 (順序重要)
- 同時重定向 stdout + stderr: >file 2>&1 (POSIX),或 &>file (bash)
- 丟棄輸出: >/dev/null / 2>/dev/null
- 管道 | 只傳 stdout; 要傳兩者用 2>&1| 或 |& (bash)
結語
??通過本文的詳細講解,相信你已經對命令行操作中的邏輯運算符、標準文件描述符、重定向和管道有了更深入的理解。這些工具和技巧將幫助你在日常的命令行操作中更加高效和靈活地處理各種任務。希望你能將這些知識應用到實際工作中,不斷提升自己的命令行操作能力。Happy coding!