將輸出重定向到文件或程序
- 標(biāo)準(zhǔn)輸入潜支、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤
進(jìn)程使用稱為文件描述符的通道來(lái)獲取輸入并發(fā)送輸出。所有進(jìn)程在開始時(shí)至少要有三個(gè)文件描述符:標(biāo)準(zhǔn)輸入(通道0)從鍵盤上讀取輸入浅悉;標(biāo)準(zhǔn)輸出(通道1)將正常輸出發(fā)送到終端趟据;標(biāo)準(zhǔn)錯(cuò)誤(通道2)將錯(cuò)誤消息發(fā)送到終端
通道(文件描述符)
-- 0 stdin 標(biāo)準(zhǔn)輸入 鍵盤 僅讀取
-- 1 stdout 標(biāo)準(zhǔn)輸出 終端 僅寫入
-- 2 stderr 標(biāo)準(zhǔn)錯(cuò)誤 終端 僅寫入
]# ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdout -> /proc/self/fd/1
- 將輸出重定向到文件
重定向stdout可以阻止進(jìn)程輸出顯示在終端上。stdout不會(huì)阻止stderr錯(cuò)誤消息顯示在終端上术健。如果文件不存在汹碱,則會(huì)創(chuàng)建文件;如果文件確實(shí)存在荞估,但是所需的重定向沒(méi)有附加到文件咳促,則該文件的內(nèi)容將被覆蓋。如果想要丟棄消息勘伺,特殊文件/dev/null以靜默的方式丟棄重定向到其自身的通道輸出跪腹,并且始終是空文件。
輸出重定向操作符:
-- > file 重定向stdout以覆蓋文件
-- >> file 重定向stdout以附加到文件
-- 2> file 重定向stderr以覆蓋文件
-- 2> /dev/null 將stderr錯(cuò)誤消息重定向到/dev/null飞醉,從而將它丟棄
-- > file 2>&1或& > file 重定向stdin和stderr以覆蓋同一個(gè)文件
-- >> file 2>&1或&>> file 重定向stdin和stderr附加到同一個(gè)文件
#將命令的輸出重定向到某個(gè)文件中
[user@serverb ~]$ date >/tmp/saved-timestamp
[user@serverb ~]$ cat /tmp/saved-timestamp
Sat Mar 18 14:33:08 CST 2023
#將命令的錯(cuò)誤消息重定向到某個(gè)文件中尺迂,標(biāo)準(zhǔn)輸出默認(rèn)輸出在終端
[user@serverb ~]$ find /etc/ -name passwd 2> /tmp/errors
/etc/passwd
/etc/pam.d/passwd
[user@serverb ~]$ cat /tmp/errors
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#將命令的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤分別重定向到兩個(gè)不同的文件中
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /tmp/errors
[user@serverb ~]$ cat /tmp/output /tmp/errors
/etc/passwd
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#將標(biāo)準(zhǔn)輸出重定向到某個(gè)文件中,標(biāo)準(zhǔn)錯(cuò)誤直接忽略
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /dev/null
[user@serverb ~]$ cat /tmp/output
/etc/passwd
/etc/pam.d/passwd
#將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一并重定向到文件中
[user@serverb ~]$ find /etc/ -name passwd &> /tmp/saved-both
[user@serverb ~]$ cat /tmp/saved-both
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
/etc/passwd
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤追加到現(xiàn)有的文件中
[user@serverb ~]$ find /etc/ -name passwd >> /tmp/saved-both 2>&1
構(gòu)建管道
管道是一個(gè)或多個(gè)命令的序列冒掌,用豎線字符(|)分隔噪裕。管道將第一個(gè)命令的標(biāo)準(zhǔn)輸出連接到下一個(gè)命令的標(biāo)準(zhǔn)輸入
#查看最近更新的是個(gè)文件并重定向到文件中
[user@serverb etc]$ ls -tl | head -10 >/tmp/ten-last-change-file
[user@serverb etc]$ cat /tmp/ten-last-change-file
total 1100
-rw-r--r--. 1 root root 58 Mar 14 16:21 subgid
-rw-r--r--. 1 root root 58 Mar 14 16:21 subuid
----------. 1 root root 408 Mar 14 16:21 gshadow
-rw-r--r--. 1 root root 518 Mar 14 16:21 group
----------. 1 root root 766 Mar 14 16:21 shadow
-rw-r--r--. 1 root root 976 Mar 14 16:21 passwd
-rw-r--r--. 1 root root 22607 Mar 14 10:34 ld.so.cache
----------. 1 root root 737 Mar 13 21:09 shadow-
-rw-r--r--. 1 root root 503 Mar 13 20:49 group-
- tee命令
當(dāng)重定向和管道重合時(shí),shell會(huì)首先設(shè)置整個(gè)管道股毫,然后重定向輸入/輸出膳音。如果管道的中間使用了輸出重定向,則輸出將轉(zhuǎn)至文件铃诬,而不是下一個(gè)前往管道中的下一個(gè)命令
#終端上沒(méi)有任何輸出
[user@serverb glob]$ ls -l >/tmp/files | less
#如果使用了tee命令祭陷,終端會(huì)有文件的內(nèi)容
[user@serverb glob]$ ls -l | tee /tmp/files | less
#管道末尾使用tee命令,則可以保存命令的最終輸出并且同時(shí)輸出到終端
[user@serverb etc]$ ls -tl |head -n 10 | tee /tmp/last-files
total 1100
-rw-r--r--. 1 root root 58 Mar 14 16:21 subgid
-rw-r--r--. 1 root root 58 Mar 14 16:21 subuid
----------. 1 root root 408 Mar 14 16:21 gshadow
-rw-r--r--. 1 root root 518 Mar 14 16:21 group
----------. 1 root root 766 Mar 14 16:21 shadow
-rw-r--r--. 1 root root 976 Mar 14 16:21 passwd
-rw-r--r--. 1 root root 22607 Mar 14 10:34 ld.so.cache
----------. 1 root root 737 Mar 13 21:09 shadow-
-rw-r--r--. 1 root root 503 Mar 13 20:49 group-
vim編輯器
最小化安裝的Linux系統(tǒng)沒(méi)有vim編輯器趣席,需要安裝vim-minimal軟件包兵志。vim編輯器是隨Linux和unix系統(tǒng)分發(fā)的vi編輯器改進(jìn)的,功能特別強(qiáng)大宣肚。
如果文件不存在想罕,則vim可以新建文件
編輯器的三種模式:
命令模式 插入模式 末行模式
命-----按i鍵-----插入模式(按ESC鍵回到命令模式)
令
模
式-----按:鍵-----末行模式(按ESC鍵回到命令模式)
命令模式下復(fù)制、粘貼:
復(fù)制1行(yy)霉涨、復(fù)制3行(3yy)
粘貼到當(dāng)前行之后(p)
命令模式下刪除:
刪除單個(gè)字符(x)
刪除到行首(d^)按价、刪除到行尾(d$)
刪除1行(dd)、刪除3行(3dd)
命令模式下查找關(guān)鍵字:
搜索(/word) 切換結(jié)果(n笙瑟、N)
補(bǔ)充:在命令模式下大寫的C楼镐,可以刪除光標(biāo)之后,并且進(jìn)入輸入模式
- vim的可視模式
可視模式是一種突出顯示和操作文本的絕佳方式往枷;最明顯的就是在生產(chǎn)環(huán)境中修改配置文件(可批量取消注釋和批量添加注釋)
-- 操作方法:
添加注釋:
1.將光標(biāo)放在要注釋首行的行首CTRL+v進(jìn)入可視模式
2.向下移動(dòng)光標(biāo)框产,選中要添加注釋的行
3.按下shift+i鍵凄杯,并輸入#
4.按下ESC鍵,過(guò)后就批量注釋了
取消注釋:
1.將光標(biāo)移動(dòng)到要取消注釋的首行的行首CTRL+v進(jìn)入可視模式
2.向下移動(dòng)光標(biāo)秉宿,選中要取消注釋的行
3.按下shift+x戒突,即可取消注釋
更改shell環(huán)境
bash shell允許設(shè)置shell變量,你可以使用這些變量來(lái)幫助運(yùn)行命令和修改shell的行為蘸鲸。還可以將shell變量導(dǎo)出為環(huán)境變量妖谴,他們會(huì)在程序啟動(dòng)時(shí)自動(dòng)復(fù)制到從該shell運(yùn)行的程序中
- 使用變量
變量定義的命名規(guī)則:可以包含大寫或小寫字母、數(shù)字和下劃線
#定義一個(gè)變量
[user@serverb ~]$ variablename=value
#可以使用$來(lái)引用變量
[user@serverb ~]$ echo $variablename
value
#使用unset取消一個(gè)變量
[user@serverb ~]$ unset variablename
使用set命令列出當(dāng)前設(shè)置的所有shell變量
#定義一個(gè)變量酌摇,就能在set命令的最后看到所定義的變量
[user@serverb ~]$ set | less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
... ...
- 使用shell變量配置bash
-- 例子1:history命令是顯示當(dāng)前用戶所執(zhí)行的歷史命令,有兩個(gè)shell變量定義HISTFILE(歷史命令存放的文件)和HISTFILESIZE(定義歷史命令的條數(shù))
[user@serverb ~]$ echo $HISTFILE
/home/user/.bash_history
[user@serverb ~]$ echo $HISTFILESIZE
1000
擴(kuò)展:如何將history顯示的內(nèi)容加上日期時(shí)間
vim ~/.bashrc
#在文件最后一行添加
HISTTIMEFORMAT="%F %T "
#加載配置文件
source ~/.bashrc
#展示
[user@serverb ~]$ history | head -1
1 2023-03-18 14:32:31 date
-- 例子2:PS1變量顯示的是shell提示符的格式
[user@serverb ~]$ echo $PS1
[\u@\h \W]\$
#可以修改
vim ~/.bashrc
#添加變量
PS1="[\u@\h \t \W]\$"
source ~/.bashrc
#提示符變了
[user@serverb 17:03:53 ~]$
使用環(huán)境變量配置程序
以上的HISTFILE和HISTFILESIZE膝舅、PS1不需要導(dǎo)出為環(huán)境變量,因?yàn)樗鼈儍H僅供shell本身使用窑多,而不由從該shell運(yùn)行的程序使用仍稀。
#例如修改語(yǔ)言
[user@serverb 17:18:20 ~]$echo $LANG
en_US.UTF-8
[user@serverb 17:18:39 ~]$export LANG=zh_CN.utf8
[user@serverb 17:18:53 ~]$date
2023年 03月 18日 星期六 17:18:55 CST
#env命令可查案shell的所有環(huán)境變量
[user@serverb 17:31:56 ~]$env
XDG_SESSION_ID=31
HOSTNAME=serverb
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=user
... ...
- 重要的環(huán)境變量PATH
PATH變量是一個(gè)含有程序目錄的冒號(hào)分隔列表
[user@serverb 17:25:15 ~]$echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
當(dāng)運(yùn)行l(wèi)s等命令是,shell會(huì)按照順序逐一在這些命令中查找可執(zhí)行文件ls埂息,并且運(yùn)行它找到的第一個(gè)匹配的文件
#自己創(chuàng)建一個(gè)命令
[user@serverb 17:30:05 ~]$vim aiguo
[user@serverb 17:30:47 ~]$bash aiguo
i love you
[user@serverb 17:30:51 ~]$chmod +x aiguo
[user@serverb 17:31:11 ~]$./aiguo
i love you
[user@serverb 17:31:16 ~]$pwd
/home/user
#將腳本所在目錄添加到環(huán)境變量中
[user@serverb 17:31:24 ~]$export PATH=$PATH:/home/user
[user@serverb 17:31:53 ~]$aiguo
i love you
自動(dòng)設(shè)置環(huán)境變量
- 按照慣例技潘,shell自動(dòng)設(shè)置的環(huán)境變量和shell變量具有使用全部大寫字母的名稱。如果要設(shè)置自己的變量千康,可能需要使用由小寫字符組成的名稱來(lái)幫助避免命名沖突享幽。
- 如果希望在shell啟動(dòng)時(shí)自動(dòng)設(shè)置shell或環(huán)境變量,可以編輯bash啟動(dòng)腳本拾弃。啟動(dòng)bash時(shí)值桩,會(huì)運(yùn)行幾個(gè)包含shell命令的文本文件,以初始化shell環(huán)境豪椿。
重要:
在Linux中奔坟,以下是四個(gè)常見(jiàn)的shell配置文件及其作用和區(qū)別:
1./etc/profile:系統(tǒng)級(jí)別的全局配置文件,對(duì)所有用戶都生效搭盾。在用戶登錄時(shí)咳秉,該文件會(huì)被讀取并執(zhí)行,設(shè)置一些系統(tǒng)級(jí)別的環(huán)境變量鸯隅、別名澜建、PATH等。一般不建議在該文件中添加個(gè)人的配置信息滋迈,因?yàn)檫@會(huì)影響所有用戶霎奢。
2./etc/bashrc:系統(tǒng)級(jí)別的bash shell配置文件,同樣對(duì)所有用戶都生效饼灿。在用戶打開新的終端時(shí),該文件會(huì)被讀取并執(zhí)行帝美,設(shè)置一些系統(tǒng)級(jí)別的別名碍彭、環(huán)境變量等。一般也不建議在該文件中添加個(gè)人的配置信息。
3.~/.bash_profile:用戶級(jí)別的bash shell配置文件庇忌,僅對(duì)當(dāng)前用戶生效舞箍。在用戶登錄時(shí),該文件會(huì)被讀取并執(zhí)行皆疹,設(shè)置個(gè)人的環(huán)境變量疏橄、PATH、別名等略就。一些基于bash的系統(tǒng)捎迫,如macOS,默認(rèn)會(huì)在用戶主目錄下創(chuàng)建該文件表牢,以便用戶自定義shell配置窄绒。
4.~/.bashrc:用戶級(jí)別的bash shell配置文件,僅對(duì)當(dāng)前用戶生效崔兴。在用戶打開新的終端時(shí)彰导,該文件會(huì)被讀取并執(zhí)行,設(shè)置個(gè)人的別名敲茄、環(huán)境變量位谋、shell函數(shù)等。該文件是用戶自定義shell配置的主要文件堰燎,經(jīng)常用于設(shè)置個(gè)人的命令別名掏父、修改提示符等。
總的來(lái)說(shuō)爽待,系統(tǒng)級(jí)別的配置文件作用于所有用戶损同,個(gè)人級(jí)別的配置文件僅作用于當(dāng)前用戶。在修改這些配置文件時(shí)鸟款,建議備份原有的文件膏燃,并確保修改不會(huì)影響系統(tǒng)的正常運(yùn)行。