特殊符號與環境變量
目錄
輸出輸入重定向
管道命令符
命令行的通配符
常用的轉義字符
重要的環境變量
參考資料
輸出輸入重定向
輸入重定向是指把文件導入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數據信息寫入到指定文件中。在日常的學習和工作中,相較於輸入重定向,我們使用輸出重定向的頻率更高,所以又將輸出重定向分為了標準輸出重定向和錯誤輸出重定向兩種不同的技術,以及清空寫入與追加寫入兩種模式。
標準輸入重定向(STDIN,文件描述符為0):默認從鍵盤輸入,也可從其他文件或命令中輸入。
標準輸出重定向(STDOUT,文件描述符為1):默認輸出到屏幕。
錯誤輸出重定向(STDERR,文件描述符為2):默認輸出到屏幕。
符號 |
作用 |
命令 < 文件 |
將文件作為命令的標準輸入(將文件內容導入到命令中) |
命令 << 分界符 |
從標準輸入中讀入,直到遇見分界符才停止 |
命令 < 文件1 > 文件2 |
將文件1作為命令的標準輸入並將標準輸出到文件2 |
表3-1 輸入重定向中用到的符號及其作用
符號 |
作用 |
命令 > 文件 |
將標準輸出重定向到一個文件中(清空原有文件的數據) |
命令 2> 文件 |
將錯誤輸出重定向到一個文件中(清空原有文件的數據) |
命令 >> 文件 |
將標準輸出重定向到一個文件中(追加到原有內容的後面) |
命令 2>> 文件 |
將錯誤輸出重定向到一個文件中(追加到原有內容的後面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 |
將標準輸出與錯誤輸出共同寫入到文件中(追加到原有內容的後面) |
表3-2 輸出重定向中用到的符號及其作用
對於重定向中的標準輸出模式,可以省略文件描述符1不寫,而錯誤輸出模式的文件描述符2是必須要寫的
示例:
[root@redhat7 home]# man bash > 123.txt <==將man bash命令原本要輸出到屏幕的信息寫入到文件
[root@redhat7 home]# cat 123.txt
BASH(1) General Commands Manual BASH(1)
NAME
bash - GNU Bourne-Again SHell
SYNOPSIS
bash [options] [file]
...
[root@redhat7 home]# echo "welcome to linux"> 123.txt <==重定向技術中的覆蓋寫入
[root@redhat7 home]# echo "hello 1234567">> 123.txt <==追加寫入
[root@redhat7 home]# cat 123.txt
welcome to linux
hello 1234567
[root@redhat7 home]# mkdir -p linux
[root@redhat7 home]# ls -l linux
總用量 0
[root@redhat7 home]# ls -l linux > /root/stderr.txt <==標準輸出即可將原本要輸出到屏幕的信息寫入到文件中
[root@redhat7 home]# ls -l linux 2> /root/stderr.txt <==錯誤的輸出重定向則依然把信息輸出到了屏幕上
總用量 0
如果想把命令的報錯信息寫入到文件,該怎麽操作呢?當用戶在執行一個自動化的Shell腳本時,這個操作會特別有用,而且特別實用,因為它可以把整個腳本執行過程中的報錯信息都記錄到文件中,便於安裝後的排錯工作。接下來我們以一個不存在的文件進行實驗
[root@redhat7 home]# ls -l xxxxx
ls: 無法訪問xxxxx: 沒有那個文件或目錄
[root@redhat7 home]# ls -l xxxxx > /root/stderr.txt
ls: 無法訪問xxxxx: 沒有那個文件或目錄
[root@redhat7 home]# ls -l xxxxx 2> /root/stderr.txt
[root@redhat7 home]# cat /root/stderr.txt
ls: 無法訪問xxxxx: 沒有那個文件或目錄
[root@redhat7 home]# wc -l < 123.txt
2
管道命令符
管道命令符的作用可以用一句話來概括“把前一個命令原本要輸出到屏幕的標準正常數據當作是後一個命令的標準輸入”。(說白了就是可以提高效率,任意門(穿越/傳送))
在修改用戶密碼時,通常都需要輸入兩次密碼以進行確認,這在編寫自動化腳本時將成為一個非常致命的缺陷。通過把管道符和passwd命令的--stdin參數相結合,我們可以用一條命令來完成密碼重置操作
[root@linuxprobe ~]# echo "linuxprobe" | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
格式:命令A | 命令B | 命令C...
命令行的通配符
方便查找文件,提高效率;通配符就是通用的匹配信息的符號。
* 代表匹配零個或多個字符
? 代表匹配單個字符
[0-9]代表匹配0~9之間的單個數字的字符
[abc]代表匹配a、b、c三個字符中的任意一個字符
示例:
[root@linuxprobe ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
...
[root@linuxprobe ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
...
[root@linuxprobe ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
...
常用的轉義字符
為了能夠更好地理解用戶的表達,Shell解釋器還提供了特別豐富的轉義字符來處理輸入的特殊數據。
1.4個最常用的轉義字符
反斜杠(\):使反斜杠後面的一個變量變為單純的字符串(單個轉義)。
單引號(‘‘):轉義其中所有的變量為單純的字符串。(全局轉義)
雙引號(""):保留其中的變量屬性,不進行轉義處理(整體)。
反引號(``):把其中的命令執行後返回結果(執行命令)。
示例:
[root@linuxprobe ~]# PRICE=5 <==定義一個名為PRICE的變量並賦值為5
[root@linuxprobe ~]# echo "Price is $PRICE" <==輸出以雙引號括起來的字符串與變量信息
Price is 5
[root@linuxprobe ~]# echo "Price is $$PRICE" <==希望能夠輸出“Price is $5”(但美元符號與變量提取符號合並後的$$作用是顯示當前程序的進程ID號碼)
Price is 3767PRICE
[root@linuxprobe ~]# echo "Price is \$$PRICE" <==想讓第一個“$”乖乖地作為美元符號,那麽就需要使用反斜杠(\)來進行轉義,將這個命令提取符轉義成單純的文本,去除其特殊功能。
Price is $5
2.特殊符號
> 標準輸出重定向
>> 標準追加重定向
< 標準輸入
<< 追加輸入
. 當前目錄/linux下面的隱藏文件
.. 當前用戶的上一級目錄
~ 當前用戶的家目錄
/ 根; 路徑的分割符號
\ 臨時取消別名
| 管道
! vim中強制; 取反 find awk; 使用歷史命令
# 註釋
$ 取出變量裏的內容
&& 並且 前一個命令運行成功,然後再運行後面的命令
; 分開多條命令 在同一行裏面放入多個命令
|| 或者 前面命令執行失敗了再執行後面的
重要的環境變量
變量是計算機系統用於保存可變值的數據類型。在Linux系統中,變量名稱一般都是大寫的,這是一種約定俗成的規範。我們可以直接通過變量名稱來提取到對應的變量值。
Linux系統中的環境變量是用來定義系統運行環境的一些參數,比如每個用戶不同的家目錄、郵件存放位置等。
1.在用戶執行了一條命令之後,Linux系統中到底發生了什麽事情呢?
第1步:判斷用戶是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是的話則直接執行。(路徑+命令名稱)
第2步:Linux系統檢查用戶輸入的命令是否為“別名命令”,即用一個自定義的命令名稱來替換原本的命令名稱。(alias 別名=命令:給命令起一個小名,使用“unalias 別名”取消)
第3步:Bash解釋器判斷用戶輸入的是內部命令還是外部命令。(type+命令:判斷命令是外部命令)
第4步:系統在多個路徑中查找用戶輸入的命令文件,而定義這些路徑的變量叫作PATH,可以簡單地把它理解成是“解釋器的小助手”,作用是告訴Bash解釋器待執行的命令可能存放的位置,然後Bash解釋器就會乖乖地在這些位置中逐個查找。
PATH是由多個路徑值組成的變量,每個路徑值之間用冒號間隔,對這些路徑的增加和刪除操作將影響到Bash解釋器對Linux命令的查找。
2.為什麽不能將當前目錄(.)添加到PATH中呢?
盡管可以將當前目錄(.)添加到PATH變量中,從而在某些情況下可以讓用戶免去輸入命令所在路徑的麻煩。但是,如果黑客在比較常用的公共目錄/tmp中存放了一個與ls或cd命令同名的木馬文件,而用戶又恰巧在公共目錄中執行了這些命令,那麽就極有可能中招了。
所以,作為一名態度謹慎、有經驗的運維人員,在接手了一臺Linux系統後一定會在執行命令前先檢查PATH變量中是否有可疑的目錄。
3. Linux系統中最重要的10個環境變量
變量名稱 |
作用 |
HOME |
用戶的主目錄(即家目錄) |
SHELL |
用戶在使用的Shell解釋器名稱 |
HISTSIZE |
輸出的歷史命令記錄條數 |
HISTFILESIZE |
保存的歷史命令記錄條數 |
|
郵件保存路徑 |
LANG |
系統語言、語系名稱 |
RANDOM |
生成一個隨機數字 |
PS1 |
Bash解釋器的提示符(對於root用戶是#,對於普通用戶是$) |
PATH |
定義解釋器搜索用戶執行命令的路徑 |
EDITOR |
用戶默認的文本編輯器 |
表4-1 Linux系統中最重要的10個環境變量
Linux作為一個多用戶多任務的操作系統,能夠為每個用戶提供獨立的、合適的工作運行環境,因此,一個相同的變量會因為用戶身份的不同而具有不同的值。
其實變量是由固定的變量名與用戶或系統設置的變量值兩部分組成的,我們完全可以自行創建變量,來滿足工作需求。
但是,這樣的變量不具有全局性,作用範圍也有限,默認情況下不能被其他用戶使用。如果工作需要,可以使用export命令將其提升為全局變量,這樣其他用戶也就可以使用它了。
示例:
[root@linuxprobe ~]# echo $HOME
/root
[root@linuxprobe ~]# su - linuxprobe
Last login: Fri Feb 27 19:49:57 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ echo $HOME
/home/linuxprobe
[root@linuxprobe ~]# mkdir /home/workdir
[root@linuxprobe ~]# WORKDIR=/home/workdir
[root@linuxprobe ~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir
[root@linuxprobe workdir]# su linuxprobe
Last login: Fri Mar 20 20:52:10 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe ~]$ echo $WORKDIR
[linuxprobe@linuxprobe ~]$ exit
[root@linuxprobe ~]# export WORKDIR
[root@linuxprobe ~]# su linuxprobe
Last login: Fri Mar 20 21:52:10 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe workdir]$ pwd
/home/workdir
4.相關文件
/etc/profile: 此文件為系統的每個用戶設置環境信息,一般用於設置所有用戶使用的全局變量。
/etc/bashrc: 當 bash shell 被打開時,該文件被讀取。也就是說,每次新打開一個終端 shell,該文件就會被讀取。
4.1.對單個用戶生效
- ~/.bash_profile 或 ~/.profile: 只對單個用戶生效,當用戶登錄時該文件僅執行一次。用戶可使用該文件添加自己使用的 shell 變量信息。
執行的順序是:~/.bash_profile、 ~/.bash_login、 ~/.profile
- ~/.bashrc: 只對單個用戶生效,當登錄以及每次打開新的 shell 時,該文件被讀取。
4.2.對所有用戶生效
- /etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,後者與登錄用戶有關,系統是先執行/etc/environment,再執行/etc/profile。
4.3.簡單修改環境變量(全局)
vim /etc/profile
export PATH=${PATH}:/usr/local/src/phantomjs/bin/ <==在文件的最後一行,添加安裝路徑path語句:(註意路徑是phantomjs的安裝路徑)
:wq <==保存修改後的文件
source /etc/profile <==使用命令使環境變量生效
發下學習筆記
參考資料
劉瑞 Linux就該怎麽學
特殊符號與環境變量