1、數據流
不管正確或錯誤的數據都是默認輸出到屏幕上,所以屏幕是混亂的。所以就需要用數據流重定向將這兩 條數據分開。數據流重定向可以將標準輸出和標準錯誤輸出分別傳送到其他的文件或設備去
標準輸入(standard input,簡稱stdin):默認情況下,標準輸入指從鍵盤獲取的輸入 標準輸出(standard output,簡稱stdout):默認情況下,命令執行所回傳正確的信息會輸出到 屏幕上 標準錯誤輸出(standard error output,簡稱stderr):默認情況下,標準錯誤輸出可理解為命令 執行失敗后,所回傳的錯誤信息會輸出到屏幕上
Number | Channel name | Description | Default connection | Usage |
---|---|---|---|---|
0 | stdin | Standard input | Keyboard | read only |
1 | stdout | Standard output | Terminal | write only |
2 | stderr | Standard error | Terminal | write only |
3+ | filename | Other files | none | read and/or write |
-
Number 0(stdin):
- 含義:標準輸入,是程序獲取輸入數據的通道。
- 默認連接:通常關聯鍵盤,用戶通過鍵盤輸入數據。
- 使用方式:只讀(程序通過此通道讀取輸入內容)。
-
Number 1(stdout):
- 含義:標準輸出,程序正常運行時輸出結果的通道(如命令執行結果)。
- 默認連接:關聯終端,結果直接顯示在終端界面。
- 使用方式:只寫(程序向此通道寫入輸出內容)。
-
Number 2(stderr):
- 含義:標準錯誤,程序運行錯誤或警告信息的輸出通道。
- 默認連接:同樣關聯終端,錯誤信息默認顯示在終端。
- 使用方式:只寫(程序向此通道寫入錯誤信息)。
-
Number 3+(filename):
- 含義:代表除 stdin、stdout、stderr 外的其他文件描述符,用于操作普通文件、自定義文件等。
- 默認連接:無默認關聯對象,需手動指定文件。
- 使用方式:可讀、可寫或讀寫結合,根據實際文件操作需求而定(如打開文件讀寫數據)。
例如:
命令 -- ip a
查看目錄屬性 -- ll /root
2、重定向操作符
重定向操作符可以將命令輸入和輸出數據流從默認設備重定向到其他位置。重定向操作符本身不是命令,而是命令中附加的可改變命令的輸入和輸出對象的特殊符號。
-
輸出重定向操作符:>、>>
-
輸入重定向操作符:<、<<
輸出重定向
- 標準輸出重定向: 1> 或>、 1>> 或>>
- 標準錯誤輸出重定向:2>、 2>>
案例1:輸出重定向(覆蓋)
將ip a的標準輸出重定向到 /root/file1 -- ip a >/root/file1?(覆蓋了file1里面原本的內容,如果file1原本不存在,在重定向時創建了file1,> 命令也可以寫成 1>,1可以省略)
?案例2:輸出重定向(追加)
將ip a的標準輸出重定向到 /root/file1 -- ls /root?>>?/root/file3(追加到已有內容后面,不會覆蓋已有內容)
案例3:錯誤輸出重定向
將標準錯誤輸出重定向到/root/file3???2>/root/file1
(由下圖可知?,同時前者的內容覆蓋了后者原本的內容,2>? 2不能省略)
案例4: 正確和錯誤都輸入到相同位置
?ls /home/ ?/aaaaaaaaa &>list.txt ?
案例5: 正確和錯誤都輸入到相同位置
?ls /home/ ?/aaaaaaaaa >list1.txt 2>&1?
2>&1和 &>的區別
1.?2>&1
- 含義:
2>&1
?是一種手動的重定向操作,它的作用是將標準錯誤輸出(stderr
)重定向到標準輸出(stdout
)。這里的?2
?代表標準錯誤輸出,1
?代表標準輸出,&
?用于明確表示后面跟著的是一個文件描述符,而不是文件名。
2.?&>
- 含義:
&>
?是一種簡寫形式,它的功能是同時將標準輸出和標準錯誤輸出重定向到同一個文件。它等同于?> file 2>&1
。
區別總結
- 語法簡潔性:
&>
?是更簡潔的寫法,能一次性完成標準輸出和標準錯誤輸出的重定向;而?2>&1
?通常需要與單獨的標準輸出重定向操作(如?> file
)配合使用。 - 使用場景:如果只是單純想把標準輸出和標準錯誤輸出都重定向到同一個文件,使用?
&>
?更方便;如果需要更復雜的重定向操作,例如先將標準錯誤輸出重定向到標準輸出,再對合并后的輸出進行其他處理,那么使用?2>&1
?更合適。
案例6:重定向到空設備/dev/null
一般將標準錯誤輸出重定向到空文件(黑洞),這樣標準錯誤輸出不會輸出在屏幕上,也不會有新文件產生。例如:
輸入重定向操作符:<、<<(追加重定向)
使用形式 | 功能 |
命令 >文件或命令 1>文件 | 將命令執行后的標準輸出信息不在默認的屏幕上顯示,而是以覆蓋的方式寫入到指定文件中,若指定的文件不存在,則自動創建該文件 |
命令 2>文件 | 將命令執行后所產生的錯誤信息不在默認的屏幕上顯示,而是以覆蓋的方式寫入到指定文件中,若指定的文件不存在,則自動創建該文件 |
命令 2>/dev/null | 將命令執行后所產生的錯誤信息不在默認的屏幕上顯示,而是寫入到空設備文件中,即將輸出的錯誤信息丟棄掉 |
命令 &>文件或 命令 >&文件 | 將命令執行后的正確輸出信息和錯誤信息不在默認的屏幕上顯示,而是以覆蓋的方式寫入到指定文件中,若指定的文件不存在,則自動創建該文件 |
命令 >>文件 | 將命令執行后的正確輸出信息以追加的方式寫入到指定的文件中,不覆蓋原文件內容,若指定的文件不存在,則自動創建該文件 |
命令 <文件 | 使命令從指定的文件中讀取數據作為輸入 |
命令 <<結束標識字符串 | 在命令行讀取數據作為輸入,直到遇到指定的結束標識字符串 |
標準輸入重定向:< 或0<、0<<或<<
案例1:從文件讀取數據作為cat命令的輸入
[root@master ~]echo test > file
[root@master ~]cat < filetest
案例2:標準輸入重定向<<并不表示追加,而是表示輸入結束的意思,即作為一個結束符
[root@localhost ~]cat > file3 << file\> hello\> file# 利用<<右側的控制字符,我們可以終止輸入,不必輸入ctrl+d來結束。
[root@localhost ~]cat file3hello
將標準輸出重定向到文件?
echo命令
語法格式為:“echo [字符串] [$變 量]”
echo命令用于在終端設備上輸出字符串或變量提取后的值,執行“echo 字符串”或“echo $變量”就可以,其中$符號意思是提取變量的實際值,以便后續的輸出操作。
指定字符串輸出到終端屏幕
例如:
root@rrl-virtual-machine:~# echo bugagihia.com
bugagihia.com
使用“$變量”的方式提取出變量SHELL的值,并將其輸出到屏幕上
例如:
root@rrl-virtual-machine:~# echo $SHELL
/bin/bash
bash shell提示符
PS1
?是 Linux 系統中 Bash shell 的環境變量,用于定義命令行提示符的顯示格式。通過設置?PS1
,可自定義提示符展示的內容,例如當前用戶、主機名、工作目錄、時間等信息。
root@rrl-virtual-machine:~# echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$PS1常用的參數含義如下:
\d :#代表日期,格式為weekday month date,例如:"Mon Aug 1"\H :#完整的主機名稱
\h :#僅取主機的第一個名字
\t :#顯示時間為24小時格式,如:HH:MM:SS\T :#顯示時間為12小時格式
\A :#顯示時間為24小時格式:HH:MM\u :#當前用戶的賬號名稱
\v :#BASH的版本信息
\w :#完整的工作目錄名稱
\W :#利用basename取得工作目錄名稱,所以只會列出最后一個目錄
\# :#下達的第幾個命令
\$ :#提示字符,如果是root時,提示符為:# ,普通用戶則為:$
默認root用戶?PS1
?本身的格式定義:[root@localhost ~]#? ?-- [\u@\h \W]\$
臨時修改?PS1格式:
export命令
執行后,提示符會按?[\u@\h \A] \w \$
?規則顯示,包含:
\u
:當前用戶名;\h
:主機名簡稱;\A
:24 小時制簡化時間(HH:MM
);\w
:完整工作目錄;\$
:提示符符號(root
?用戶顯示?#
,普通用戶顯示?$
)。
例如:這里修改了PS1格式,多了[ ]和時間?
永久生效(修改配置文件)?
若需永久應用,編輯用戶配置文件(如?~/.bashrc
):
echo 'export PS1="[\u@\h \A] \w \$ "' >> ~/.bashrc
source ~/.bashrc # 使配置立即生效