特殊符號與環境變量

 

目錄                                                              linux

輸出輸入重定向shell

管道命令符vim

命令行的通配符bash

經常使用的轉義字符運維

重要的環境變量編輯器

參考資料學習

 

輸出輸入重定向                                                
spa

  輸入重定向是指把文件導入到命令中,而輸出重定向則是指把本來要輸出到屏幕的數據信息寫入到指定文件中。在平常的學習和工做中,相較於輸入重定向,咱們使用輸出重定向的頻率更高,因此又將輸出重定向分爲了標準輸出重定向和錯誤輸出重定向兩種不一樣的技術,以及清空寫入與追加寫入兩種模式。操作系統

    標準輸入重定向(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

保存的歷史命令記錄條數

MAIL

郵件保存路徑

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就該怎麼學

相關文章
相關標籤/搜索