shell介紹、命令歷史、命令補全和別名、通配符、輸入輸出重定向

shell介紹

什麼是shell?html

shell是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。(造成比喻:用戶直接面對的不是計算機硬件面是shell,用戶把指令告訴shell,而後shell再傳輸給系統內核,接着內核再去支配計算機硬件去執行各類操做)python

一、shell是一個命令解釋器,提供用戶和機器之間的交互 好比咱們登陸的終端可以讓咱們運行命令查看結果,這就是一個shell。linux

二、支持特定語法,好比邏輯判斷、循環、for等正則表達式

三、每一個用戶均可以有本身特定的shellshell

四、CentOS7默認shell爲bash(Bourne Agin Shell,Bourne是一個用戶的名字,爲了記念他,把他開發shell叫作Bourne shell,後來在這個基礎上優化開發,造成一個新的shell,叫作bash shell,也就是在centos7下使用的這個bash shell)vim

五、除了bash shell還有zsh、ksh等,用起來跟bash差很少,但有些細節上差別,好比一些特性的差別。centos

查看系統是否有安裝zsh、ksh,若是沒有能夠yum安裝一下,示例以下bash

[root@aminglinux-01 ~]# yum list |grep zsh
zsh.x86_64                              5.0.2-25.el7                   installed
autojump-zsh.noarch                     22.3.0-3.el7                   epel     
zsh.x86_64                              5.0.2-28.el7                   base     
zsh-html.x86_64                         5.0.2-28.el7                   base     
zsh-lovers.noarch                       0.9.0-1.el7                    epel     
[root@aminglinux-01 ~]# yum list |grep ksh
ksh.x86_64                              20120801-34.el7                base     
mksh.x86_64                             46-5.el7                       base     
python-XStatic-Rickshaw.noarch          1.5.0.0-4.el7                  epel     
python-moksha-common.noarch             1.2.3-2.el7                    epel     
python-moksha-hub.noarch                1.5.3-2.el7                    epel     
python-moksha-wsgi.noarch               1.2.2-2.el7                    epel

命令歷史:

一、history命令      
#查看以前使用的命令。

二、.bash_history   
#存儲使用過的命令文件,在root的家目錄下

三、最大1000條    
#存儲使用命令的最大數,在/etc/profile文件裏更改數值

四、變量HISTSIZE    
#查看命令  echo $HISTSIZE

五、/etc/profile中修改HISTSIZE最大保存數,source保存

六、HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "   
#永久生效把這條命令添加到/etc/profile裏

七、永久保存 chattr +a ~/.bash_history

八、!!           
#執行上一條命令
九、!n             
#n表示數字,好比:!176, 這樣它就會執行命令歷史裏的176這條命令

十、!echo        
#echo表示在命令歷史裏從下往上找以echo開頭的第一條命令執行它。

示例以下less

一、.bash_history文件工具

#命令歷史保存在root的家目錄下.bash_history文件中
[root@aminglinux-01 ~]# ls /root/.bash_history 
/root/.bash_history

二、history命令

#查看以前歷史使用的命令。
[root@aminglinux-01 ~]# history 
    1  ls -l /tmp/
    2  ls -l
......
  585  ls /root/.bash_history 
  586  cat /root/.bash_history
  587  history

三、echo $HISTSIZE 顯示存放最大多少條歷史記錄

#history存儲使用命令的最大數1000條,變量HISTSIZE
[root@aminglinux-01 ~]# echo $HISTSIZE
1000

四、history –c清空內存中的歷史記錄;不會清除.bash_history文件中的記錄

#清空當前命令歷史記錄
[root@aminglinux-01 ~]# history -c   
[root@aminglinux-01 ~]# history 
    1  history 

#查看是否清空了配置文件命令,沒有,只能清空當前命令歷史的。
[root@aminglinux-01 ~]# cat .bash_history   
ls -l /tmp/
ls -l
which rm

注意:當前使用的命令並不會直接保存到.bash_history配置文件裏面去,是先存儲在內存裏,只有當你退出終端的時候纔會保存到配置文件裏。

五、定義HISTSIZE值,在配置文件/etc/profile中修改

#環境變量HISTSIZE在/etc/profile文件中搜索HISTSIZE更改命令歷史變量數值
[root@aminglinux-01 ~]# vi /etc/profile    

默認值是1000,改爲5000以下:
HISTSIZE=5000

#保存退出後查看變動並無生效
[root@aminglinux-01 ~]# echo $HISTSIZE     
1000

#更改變量執行source命令
[root@aminglinux-01 ~]# source /etc/profile  

#查看更改結果
[root@aminglinux-01 ~]# echo $HISTSIZE      
5000

六、定義格式:HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

看history是隻顯示ID號與具體命令,是否能夠把命令是何時運行的記錄下來,只須要把變量從新賦值就能夠了。

[root@aminglinux-01 ~]# history 
    1  history 
    2  cat .bash_history 
    3  vi /etc/profile
    4  echo $HISTSIZE
    5  source /etc/profile
    6  echo $HISTSIZE
    7  history 

#更改命令歷史格式,只在當前終端生效
[root@aminglinux-01 ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
[root@aminglinux-01 ~]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S
[root@aminglinux-01 ~]# history 
    1  2017/11/14 16:45:35 history 
    2  2017/11/14 16:46:43 cat .bash_history 
    3  2017/11/14 17:59:55 vi /etc/profile
    4  2017/11/14 18:04:45 echo $HISTSIZE
    5  2017/11/14 18:05:12 source /etc/profile
    6  2017/11/14 18:05:14 echo $HISTSIZE
    7  2017/11/14 18:06:30 history 
    8  2017/11/14 18:07:10 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    9  2017/11/14 18:07:34 echo $HISTTIMEFORMAT
   10  2017/11/14 18:07:57 history 

#若是想要保存如上history格式效果,就須要進入配置文件加上以下這條變量命令,保存退出。

[root@aminglinux-01 ~]# vim /etc/profile  

添加到文件最後面:
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

[root@aminglinux-01 ~]# source /etc/profile  

#這樣哪怕再開一個終端這也保存了。
[root@aminglinux-01 ~]# echo $HISTTIMEFORMAT    
%Y/%m/%d %H:%M:%S

七、給命令歷史文件增長特殊權限

#爲了讓命令歷史永久保存,不想讓其它人去破壞它,能夠給它加一個特殊的a權限,不能刪除,能夠追加。
[root@aminglinux-01 ~]# chattr +a ~/.bash_history   
[root@aminglinux-01 ~]# lsattr .bash_history 
-----a---------- .bash_history

注意:若是執行了這條命令後,你並無正常退出終端,就會致使保存的命令不全。

八、!! 連續兩個,!表示執行上一條命令。

[root@xietaolinux3 ~]# lsattr .bash_history 
-----a---------- .bash_history
[root@xietaolinux3 ~]# !!
lsattr .bash_history 
-----a---------- .bash_history

九、!n 這裏的n是數字,表示執行命令歷史中的第n條命令。

[root@xietaolinux3 ~]# history
    1  2018/12/17 16:18:32 history
    2  2018/12/17 16:30:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    3  2018/12/17 16:30:05 echo $HISTTIMEFORMAT
    4  2018/12/17 16:30:11 history
    5  2018/12/17 16:32:56 vim /etc/profile
    6  2018/12/17 16:33:09 source /etc/profile
    7  2018/12/17 16:35:10 chattr +a ~/.bash_history
    8  2018/12/17 16:35:19 lsatty .bash_history 
    9  2018/12/17 16:35:25 lsattr .bash_history 
   10  2018/12/17 16:41:17 history
   11  2018/12/17 16:41:33 lsatty .bash_history 
   12  2018/12/17 16:41:41 history
[root@xietaolinux3 ~]# !9
lsattr .bash_history 
-----a---------- .bash_history

十、!echo 表示執行命令歷史中最近一次以echo開頭的命令。

[root@xietaolinux3 ~]# history
    1  2018/12/17 16:18:32 history
    2  2018/12/17 16:30:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    3  2018/12/17 16:30:05 echo $HISTTIMEFORMAT
    4  2018/12/17 16:30:11 history
    5  2018/12/17 16:32:56 vim /etc/profile
    6  2018/12/17 16:33:09 source /etc/profile
    7  2018/12/17 16:35:10 chattr +a ~/.bash_history
    8  2018/12/17 16:35:19 lsatty .bash_history 
    9  2018/12/17 16:35:25 lsattr .bash_history 
   10  2018/12/17 16:41:17 history
   11  2018/12/17 16:41:33 lsatty .bash_history 
   12  2018/12/17 16:41:41 history
   13  2018/12/17 16:41:45 lsattr .bash_history 
   14  2018/12/17 16:42:52 history
[root@xietaolinux3 ~]# !echo
echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S

命令補全和別名:

一、tab鍵,敲一下,敲兩下(按tab鍵能夠幫咱們補全一個指令,一個路徑或者一個文件名)
二、參數補全,安裝bash-completion ,重啓系統生效  適用於centos7
三、alias別名給命令從新起個名字
四、各用戶都有本身配置別名的文件 ~/.bashrc(存放別名的路徑地址)
五、ls /etc/profile.d/(存放別名的路徑地址)
六、自定義的alias放到~/.bashrc,自定義後別名存放的地址
(永久保存alias別名,把alias信息存到/etc/bashrc裏面或者家目錄下面的.bashrc)
命令補全

Centos6中tab鍵只能補全自己,不支持參數補全;Centos7中tab鍵支持命令參數補全,須要安裝一個包bash-completion 重啓才能生效。

#使用tab測試補全這條命令參數
[root@aminglinux-01 ~]# systemctl restart network   

#安裝這個bash-completion庫
[root@aminglinux-01 ~]# yum install -y bash-completion 

#重啓系統
[root@aminglinux-01 ~]# reboot
alias別名

alias也是bash所特有的功能之一

#直接執行alias命令會看到目前系統預設的全部別名
[root@aminglinux-01 ~]# alias           
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

有的時候命令很長,打的時候不方便,效率低,這樣就可使用alias作別名,以下:

#alias別名給命令從新命名
[root@aminglinux-01 ~]# alias restartnet='systemctl restart network.service' 
[root@xietaolinux3 ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias restartnet='systemctl restart network.service'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

#設置好的別名命令生效
[root@aminglinux-01 ~]# restartnet                  

#取消設置好的別名,使用命令unalias
[root@aminglinux-01 ~]# unalias restartnet    

#別名命令失效
[root@aminglinux-01 ~]# restartnet             
-bash: restartnet: 未找到命令

配置alias的文件有哪些呢?舉例以下:

#用戶家目錄下.bashrc文件中只配置了幾個alias
[root@xietaolinux3 ~]# cat .bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

#其餘的不少別名在/etc/profile.d/目錄下,有不少.sh文件中定義
[root@xietaolinux3 ~]# ls /etc/profile.d/
256term.csh         colorgrep.csh       colorls.sh          less.csh            vim.sh              
256term.sh          colorgrep.sh        lang.csh            less.sh             which2.csh          
bash_completion.sh  colorls.csh         lang.sh             vim.csh             which2.sh    

#如colorgrep.sh文件中的grep定義的alias
[root@xietaolinux3 ~]# cat /etc/profile.d/colorgrep.sh 
# color-grep initialization

/usr/libexec/grepconf.sh -c || return

alias grep='grep --color=auto' 2>/dev/null
alias egrep='egrep --color=auto' 2>/dev/null
alias fgrep='fgrep --color=auto' 2>/dev/null

通配符

注意:命令行下的通配不區分大小寫,可是若是是正則表達式就區分了。

• ls *.txt       #表示查找.txt通配文件
• ls ?.txt       #表示一個任意的字符
• ls [0-9].txt   #列出知足條件範圍內的文件
• ls {1,2}.txt   #用花括號列出你須要的文件

*用來匹配零個或多個任意字符

[root@aminglinux-01 ~]# ls
111  1_heard.txt.bak  1.txt.bak  2.txt  456     aminglinux       
123  1_sorft.txt.bak  234        3.txt  aming2  anaconda-ks.cfg
[root@aminglinux-01 ~]# ls *.txt
2.txt  3.txt
[root@aminglinux-01 ~]# ls *txt
2.txt  3.txt
[root@aminglinux-01 ~]# ls *txt*
1_heard.txt.bak  1_sorft.txt.bak  1.txt.bak  2.txt  3.txt
[root@aminglinux-01 ~]# ls 1*
1_heard.txt.bak  1_sorft.txt.bak  1.txt.bak

111:

123:

?用來匹配一個字符

[root@aminglinux-01 ~]# ls ?.txt
2.txt  3.txt
[root@aminglinux-01 ~]# touch 1.txt
[root@aminglinux-01 ~]# ls ?.txt
1.txt  2.txt  3.txt
[root@aminglinux-01 ~]# touch a.txt
[root@aminglinux-01 ~]# touch bb.txt

#bb.txt由於是兩個字符,因此沒有匹配出來
[root@aminglinux-01 ~]# ls ?.txt
1.txt  2.txt  3.txt  a.txt

[ ]裏面能夠寫一個範圍,只要是在這個範圍內單個字符都列出來

[root@aminglinux-01 ~]# ls [0-3].txt
1.txt  2.txt  3.txt
[root@aminglinux-01 ~]# ls [12].txt
1.txt  2.txt
[root@aminglinux-01 ~]# ls [23].txt
2.txt  3.txt
[root@aminglinux-01 ~]# ls {1,2}.txt
1.txt  2.txt
[root@xietaolinux3 ~]# ls [a-z].txt
a.txt
[root@xietaolinux3 ~]# ls [0-9a-z].txt
1.txt  2.txt  3.txt  a.txt  b.txt
[root@xietaolinux3 ~]# ls [0-9A-Z].txt
1.txt  2.txt  3.txt  b.txt
[root@xietaolinux3 ~]# ls [0-9a-zA-Z].txt
1.txt  2.txt  3.txt  a.txt  b.txt

{ }花括號裏面要用「,」隔開,1.txt或者3.txt;

[root@xietaolinux3 ~]# ls {1,2,3,a}.txt
1.txt  2.txt  3.txt  a.txt

輸入輸出重定向

輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更爲經常使用,它常常用於將命令的結果輸入到文件中,而不是屏幕中。輸入重定向的命令是<,輸出重定向的命令是>。另外還有錯誤重定向2>以及追加劇定向命令>>。

一、 cat 1.txt >2.txt 
#>它會把命令產生的正確信息輸出到指定文件裏去,刪除以前文件內容重寫。

二、 cat 1.txt >> 2.txt 
#>>把前面命令輸出內容重定向追加到後面命令裏去,不刪除舊的。

三、ls aaa.txt 2> err      
#它會把命令產生的錯誤信息輸出到指定文件裏去

四、ls aaa.txt 2>> err   
#錯誤信息輸出追加劇定向     

五、2>與2>>等於&>      
#&>結合了正確與錯誤                                       
六、 wc -l < 1.txt           
#查看一個文件的行數   , 把1.txt內容輸入到重定向命令裏面去,得出結果,左邊必須是一條命令,不支持文件到文件。
>輸出重定向
[root@xietaolinux3 ~]# echo "aannccaa" > 1.txt
[root@xietaolinux3 ~]# cat 1.txt 
aannccaa
>>追加劇定向
[root@xietaolinux3 ~]# echo "aannccaa" >> 1.txt
[root@xietaolinux3 ~]# cat 1.txt 
aannccaa
aannccaa
2> 錯誤重定向
#使用錯誤命令輸出一條錯誤信息
[root@aminglinux-01 ~]# lsaaa         
-bash: lsaaa: 未找到命令

#保存一條信息到指定文件裏去
[root@aminglinux-01 ~]# lsaaa 2> a.txt 

#查看結果  
[root@aminglinux-01 ~]# cat a.txt            
-bash: lsaaa: 未找到命令
2>>錯誤追加劇定向
#追加一次錯誤信息到文件
[root@aminglinux-01 ~]# lsaaa 2>> a.txt    

#查看結果
[root@aminglinux-01 ~]# cat a.txt               
-bash: lsaaa: 未找到命令
-bash: lsaaa: 未找到命令
&>等於>+2>正確和錯誤重定向
#&>結合正確錯誤信息重定向到一個文件裏去
[root@aminglinux-01 ~]# ls [12].txt aaa.txt &> a.txt    

#查看結果 
[root@aminglinux-01 ~]# cat a.txt                           
ls: 沒法訪問aaa.txt: 沒有那個文件或目錄
1.txt
2.txt
&>>追加正確與錯誤信息重定向
[root@aminglinux-01 ~]# ls [12].txt aaa.txt &>> a.txt     
[root@aminglinux-01 ~]# cat a.txt
ls: 沒法訪問aaa.txt: 沒有那個文件或目錄
1.txt
2.txt
ls: 沒法訪問aaa.txt: 沒有那個文件或目錄
1.txt
2.txt
能夠將正確輸出到一個文件中,錯誤輸入到另外一個文件中,也能夠同時輸出到一個文件中(用&>)
#既有正確也有錯誤的輸出,區分開來保存在指定的文件裏,把正確與錯誤區分開來輸出
[root@aminglinux-01 ~]# ls [12].txt aaa.txt > 1.txt  2>a.txt

#正確    
[root@aminglinux-01 ~]# cat 1.txt    
1.txt
2.txt
#錯誤
[root@aminglinux-01 ~]# cat a.txt   
ls: 沒法訪問aaa.txt: 沒有那個文件或目錄
< 輸入重定向
#把1.txt內容輸入到重定向命令裏面去,得出結果
[root@localhost ~]# wc -l < 1.txt    
2

#左邊只能是命令,不能是文件,不支持這樣的寫法。
[root@xietaolinux3 ~]# 2.txt < 1.txt
-bash: 2.txt: 未找到命令
相關文章
相關標籤/搜索