shell介紹,命令歷史,命令補全和別名,通配符,輸入輸出重定向,管道符和做業控制

shell介紹

  • 可使用 yum list |grep zsh 或者 yum list |grep ksh
  • 這樣能夠搜索 zsh 和 ksh ,有須要的話能夠安裝
  • 總之,默認使用的就是 .bash shell

命令歷史

  • 輸入過的命令會被保存在一個文件內
  • 在shell界面,使用 上方向鍵 能夠往上查看以前輸入過的命令
  • 這個保存命令的文件地址在用戶家目錄下面
  • 例子:root 用戶的家目錄就是 /root
  • 保存過往命令的文件名稱是 .bash_history
  • 那麼root用戶保存過往命令的文件路徑就在 /root/.bash_history
  • 使用 history 命令就能夠查看記錄了多少條過往命令
  • 上圖能夠看到,輸入的最後一條命令是 history
  • 序號是1003,說明.bash_history已經記錄了1003條過往命令
  • 不過 .bash_history 最多隻能存儲1000條命令
  • 往上翻,能夠看到,命令是從序號 4 開始的
  • 由於記錄到1003條命令,但只能存1000條命令,因此最前面的3條命令被刪除了
  • 有一個系統內置的環境變量 HISTSIZE
  • 使用上圖命令,能夠看到返回的值是 1000
  • 因此 .bash_history 最大記錄的命令數量爲1000
  • 使用 history -c 命令能夠清空當前 .bash_history 的內容
  • 不過 history -c 只是清空內存中的內容,寫進硬盤的內容並不會被清空
  • 使用終端時輸入的命令都是保存在內存裏面的
  • 退出終端的時候纔會被寫入硬盤
  • HISTSIZE 環境變量能夠被修改
  • 能夠在 /etc/profile 文件中修改
  • vi 打開 profile 文件,而後找到上圖中的這個變量
  • 將變量數值修改成本身想要的數值,而後保存退出
  • 不過如今修改尚未生效,須要執行命令 source /etc/profile
  • 這樣修改纔會生效,可使用 echo $HISTSIZE 查看是否生效
  • 或者退出終端,而後從新進入後也會生效
  • 若是想把命令輸入的時間也記錄進 .bash_history
  • 可使用上圖的命令,首先賦值給環境變量 HISTTIMEFORMAT
  • "%Y%m%d %H:%M:%S " 表明時間的格式:年月日 時:分:秒
  • 使用 echo $HISTTIMEFORMAT 查看格式的值是否改變了
  • 能夠看到下面返回的值是 "%Y/%m/%d %H:%M:%S "
  • 系統默認 HISTTIMEFORMAT 的值爲空,因此新建一個終端這個變量的值是爲空的
  • 如圖,能夠看到,再使用 history 命令查看記錄在內存裏面的過往命令
  • 每一條過往命令都增長了使用時間的記錄
  • 若是但願永久保留這個設置,而不是每次打開終端都要從新設置一遍
  • 能夠在 /etc/profile 文件裏面設置這一個變量
  • 用 vim 打開 profile
  • 如圖,找到 HISTSIZE,在它的下面增長一行,HISTTIMEFORMAT
  • 就把以前設置變量的格式複製到這裏,而後保存退出
  • 而後須要 source /etc/profile 一下使其生效
  • 而後從新進入終端
  • 能夠發現,默認 HISTTIMEFORMAT 的值已是以前設置的格式了
  • 上圖命令是對 .bash_history 文件追加 a 權限
  • 增長 a 權限後,這個文件就只能被追加信息,而不會被刪除信息
  • 這樣就能夠無限的保存命令到這個命令歷史文件裏面了
  • 可是若是不正常退出終端的話,有可能過往命令會保存不全
  • 正常退出終端須要使用命令 logout 或者 exit

  • 命令 !! 會執行上一條命令,也就是說命令歷史裏面記錄的最後一條命令
  • 好比使用 ls 命令後,再使用 !! 命令
  • 那麼就會再執行一次 ls 命令,由於上一條命令是 ls

  • 命令 !n ,n表明數字
  • 使用命令 history 查看命令歷史,每一條命令都有一個id號碼
  • 例子,使用命令 !768 那麼就會執行命令歷史裏面id爲768的命令

  • 命令 !word ,word表明單詞
  • 好比在命令歷史裏面,總共使用了3次 ls /root 命令
  • 而後使用命令 !ls
  • 那麼就會執行命令歷史裏面最後一次 ls 命令
  • 也可使用 !vim 或者 !echo
  • 那麼也會執行命令歷史裏面最後一次使用 vim 或者 echo 的命令

命令補全和別名

  • tab 補全命令或者路徑
  • 例子,輸入 ls 按兩下tab
  • 系統會列出全部以 ls 開頭的系統命令出來
  • 上圖是全部系統內以 ls 開頭的命令
  • 若是輸入圖中的 lsinit 而後按一下 tab
  • 系統會自動補全後面缺失的 rd 變成 lsinitrd
  • 總結,輸入一個命令或者路徑
  • 好比 ls 或者 /ro
  • 若是存在多個命令以 ls 開頭或者路徑以 /ro 開頭
  • 那麼按兩下 tab 就能夠把全部目標列出來
  • 若是隻存在一個目標,那麼按一下tab就能夠把剩餘的部分補全
  • 如圖,輸入 /ro 而後按一下tab,系統會自動補全爲 /root/

  • 還能夠補全命令的參數,不過須要下載一個包
  • 使用上圖所示命令安裝包,能夠得到補全命令參數的功能
  • 安裝完包以後,須要先退出終端再從新鏈接纔會生效
  • 如上圖,輸入 systemctl res 而後按兩下 tab
  • 下面出現三個參數選項,rescue, reset_failed, restart
  • 或者輸入 systemctl rest 而後按一下tab
  • 就是自動補全爲 systemctl restart
  • 這就是能夠自動補全命令參數的功能

  • 上圖是使用別名
  • 如圖,alias restartnet = 'systemctl restart network.service'
  • 這樣就把'systemctl restart network.service' 這條命令取了一個別名叫作 restartnet
  • 之後只要運行 restartnet 就等因而運行了'systemctl restart network.service'這條命令
  • 如圖,使用 alias 命令就能夠查看系統內全部的別名
  • 能夠看到剛纔取的別名 restartnet 的信息
  • 關於alias別名信息保存的文件位置有兩個
  • 用戶家目錄下的 .bashrc 文件和 /etc/profile.d 目錄內的文件
  • 有一些alias信息記錄在用戶家目錄的 .bashrc 文件內
  • 如上圖,還有一些alias信息記錄在/etc/profile.d目錄內的文件內
  • 紅色箭頭指到的幾個文件都存在相關的alias信息
  • 總結,alias信息主要在這兩個地方記錄

通配符

  • 星號 * 就是通配符,表明任意長度的任意字符,包括字符數字符號等
  • 如圖,使用命令 ls *.txt
  • 就把目錄下面全部的 .txt 文件顯示出來了
  • 由於 * 表明任意長度的字符
  • 因此 *.txt 就表示 任意長度字符 + .txt
  • 因此 ls *.txt 就會列出全部 任意長度字符 + .txt 的文件

  • 還有一個通配符是問號 ?
  • 問號 ? 跟星號 * 的區別是*表明任意長度,?只表明一位字符
  • 如上圖,ls *.txt 會列出全部 .txt文件
  • 若是使用 ls ?.txt 只會列出 1.txt,2.txt,3.txt
  • 不會列出 aa.txt ,由於 aa 是兩位字符,? 只表明一位字符

  • 如圖,還有一種通配符用法是 方括號+數字或者字母
  • ls [0-3].txt 能夠顯示0到3任意一個數字 + .txt 的文件
  • ls [13].txt 能夠顯示名稱爲 1.txt 和 3.txt 的文件
  • ls [0-9a-z].txt 能夠顯示 0-9任意一個數字 或者 a-z任意一個字母 + .txt 的文件
  • 還能夠加上大寫字母如 ls [0-9a-zA-Z].txt 能夠把屬於方括號範圍內的字母或數字的.txt文件所有顯示出來

  • 如圖,還可使用花括號,做用跟方括號相似,可是書寫格式不一樣
  • 花括號必須寫逗號 , 用來間隔不一樣的項

輸入輸出重定向

  • 上圖命令就是重定向,cat 1.txt > 2.txt
  • 意思是把 1.txt 文件的內容寫入 2.txt 裏面,2.txt裏面原來的內容會被刪除
  • 上圖命令就是追加
  • 追加是指,把 1.txt 的內容寫入 2.txt
  • 可是 2.txt 原來的內容不會被刪除,1.txt的內容寫在2.txt內容的後面
  • 如圖, 2> 就是錯誤重定向的符號
  • 重定向通常是把正確執行的信息重定向到一個文件裏面
  • lsaaa 這個命令不存在,因此係統返回一個錯誤信息
  • 若是使用重定向符號 > ,由於這條命令是錯誤的,並無正確執行
  • 因此重定向是沒法生效的
  • 可是系統返回了一個錯誤信息,2> 符號能夠把這條系統返回的錯誤信息重定向到一個文件裏面
  • 上圖能夠看到,把lsaaa的錯誤信息 2> 到 a.txt 裏面
  • cat a.txt 查看內容,能夠看到內容就是系統返回的錯誤信息

  • 還可使用 追加錯誤重定向 ,符號是 2>>
  • 錯誤重定向會把文件原來的內容刪除,而後把錯誤信息寫入進去
  • 追加錯誤重定向 不會把原文件信息刪除
  • 而是把錯誤信息追加到原文件內容的後面
  • 如圖,再運行一次 lsaaa 2>> a.txt
  • a.txt 以前已經記錄了一條 lsaaa的錯誤信息
  • 如今追加一條錯誤信息
  • cat a.txt 內容,能夠看到有兩條錯誤信息

  • 重定向 和 錯誤重定向 是能夠同時使用的
  • 重定向 > + 錯誤重定向 2> = &>
  • 重定向 與 錯誤重定向 同時使用的符號就是 &>
  • 如圖,ls [12].txt aaa.txt &> a.txt
  • 這條命令是顯示 1.txt和2.txt,還有aaa.txt
  • 1.txt,2.txt都存在,因此能夠正確執行
  • aaa.txt這個文件不存在,因此係統會返回錯誤信息
  • 如今一條命令裏面,既要把正確返回的信息記錄下來
  • 又要把系統返回的錯誤信息記錄下來
  • 就須要用到 &> 符號,由於 &> == > + 2>
  • cat a.txt 查看內容,能夠看到,正確返回的信息跟錯誤信息都記錄了
  • 一樣,也能夠 正確錯誤重定向追加,符號是 &>>
  • 符號 &>> == >> + 2>>
  • 如圖,從新運行一遍以前的命令,可是符號從 &> 改成 &>>
  • 這樣就把 正確錯誤的信息 追加到 a.txt 之中了
  • 使用cat查看 a.txt 內容
  • 能夠看到,此次的正確錯誤信息被追加到上次的信息後面

  • 還能夠這樣寫,就是分別把 正確的信息 重定向到 1.txt
  • 錯誤的信息 重定向到 a.txt
  • cat 分別查看 1.txt 和 a.txt 內容
  • 能夠看到正確記錄了 正確返回信息 跟 錯誤返回信息
  • 這樣就把 正確返回 和 錯誤返回 分別重定向到不一樣的文件裏面了

  • wc -l 1.txt 能夠查看文本文檔的行數
  • wc -l < 1.txt 是輸入重定向
  • 就是把文件內容重定向到命令後面,只對命令有效,不能文件對文件
  • 幾乎不會用到,作個瞭解就行

管道符和做業控制

  • 管道符 | ,做用就是把左邊命令的結果,做爲右邊命令的做用對象
  • 如圖,cat 1.txt |wc -l
  • 首先左邊命令 cat 1.txt 會輸出一些文本
  • 輸出的文本會做爲 wc -l 的做用對象
  • wc -l 的做用是顯示文本的行數
  • cat 1.txt 輸出了一個文本對象
  • wc -l 會對這個文本對象產生做用
  • 也就是說顯示這個文本對象的行數

  • ctrl + z 能夠暫停一個任務
  • 好比在編輯一個文件,可是須要查看另一個文件
  • 這時候能夠不保存退出,而是暫停當前任務
  • 如圖,正在編輯 1.txt
  • 使用 ctrl + z 暫停當前任務
  • 能夠看到,出現一行顯示 已中止 的信息
  • 如圖,編輯 2.txt 而後使用 ctrl + z 暫停任務
  • 出現中止信息,前面的序號是 2 , 1.txt的中止信息前面的序號是 1
  • 如今已經有兩個任務被暫停了
  • 使用命令 jobs 就能夠查看有多少任務被暫停了
  • 結果顯示了兩個被暫停的任務信息
  • 如今若是想回到被暫停的任務裏面,繼續任務
  • 可使用 fg + 任務id 的辦法回到任務
  • 若是隻有一個任務,直接 fg 就能夠回到任務
  • 若是想回到 任務2 可使用 fg 2
  • 若是想回到 任務1 可使用 fg 1
  • 還可使用 bg 命令把任務放到後臺去
  • fg 命令是把任務放到前臺來
  • bg 就能夠把命令放到後臺去
  • 進入後臺的命令能夠繼續運行,由於不在前臺
  • 因此可能沒法看到
  • 把編輯 2.txt 的任務放到後臺去了
  • 使用 bg 2 ,由於這個任務的id是2
  • 若是隻有一個任務,直接 bg 就能夠放到後臺了
  • 顯示信息能夠看到,任務不是中止的,暫停任務會顯示任務已中止的信息
  • 不管把任務放到前臺仍是後臺,任務都會從中止狀態恢復
  • 存在多個任務的時候,直接fg或者bg,目標對象是最後一個任務

  • 還可使用命令方式直接後臺運行
  • sleep 100 能夠暫停系統100秒,什麼事都不幹
  • 在前臺的時候,效果是命令行消失,不能輸入命令
  • 100 秒後才恢復,在後臺的話就沒什麼做用了
  • 直接使用命令 sleep 100 & 命令後面加上符號 &
  • 這樣命令 sleep 100 會直接在後臺運行
  • 其它命令也能夠加 & 使命令直接在後臺運行
  • jobs 只能在當前終端查看
  • 開第二個終端使用jobs沒法看到上一個終端的相關信息
相關文章
相關標籤/搜索