day01:shell基礎(shell基礎、alias及重定向)

一、shell基礎介紹:shell

    shell是一個命令解釋器,用於用戶與機器的交互:vim

    也支持特定的語法(邏輯判斷,循環):bash

   每一個用戶都有本身特定的shell:Centos7的shell是bash(bourne   agin  shell):less

   shell還有zsh    ksh這兩種:spa

二、命令歷史:  history code

 命令歷史存放路徑:用戶的家目錄:用history命令能夠查看命令歷史:內存

[root@localhost ~]# ls -ld /root/.bash_history      #命令歷史所在的家目錄
-rw------- 1 root root 13038 Jun 30 22:36 /root/.bash_history
[root@localhost ~]# history                         #可直接查看系統中命令歷史
  994  yum list |grep zsh
  995  cat .bash_history
  996  ls -ld /root/.bash_history
  997  history
  998  cat .bash_history
  999  history
 1000  exit
 1001  clear
 1002  history
 1003  history |tail -10

2.1:history能夠存放1000條命令的數目:是有環境變量HISTSIZE決定的:ci

[root@localhost ~]# echo $HISTSIZE
1000

注:有時超過1000條後再寫入時則暫時存在於內存中,當正常退出終端後才寫入到文件:it

2.2:history  -c :只清空當前內存中的命令,不會清除配置文件中的歷史命令:io

[root@localhost ~]# history             #第一次看出命令歷史記錄
 1001  clear
 1002  history
 1003  history |tail -10
 1004  echo $HISTSIZE
 1005  history |tail -10
 1006  history |tail -6
[root@localhost ~]# history -c         #清除當前內存的命令歷史
[root@localhost ~]# history            #再次查看則沒有歷史記錄,當從新開啓終端後,則再次顯示:
    8  history

2.3:history命令歷史的顯示數目可定義:以下:

[root@localhost ~]# vim /etc/profile                    #編輯此配置文件:
[root@localhost ~]# cat /etc/profile |grep -C3 HISTSIZE
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=5000                                    #修改此命令條目爲5000:
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi
[root@localhost ~]# echo   HISTSIZE=5000   
[root@localhost ~]# source /etc/profile         #保存後須要刷新才能生效:
[root@localhost ~]# echo $HISTSIZE              再次查看命令歷史:
5000

/etc/porfile文件裏,搜索關鍵字"HIST"找到HISTSIZE,在此更改其數字,保存退出,而後執行/source   /etc/profile命令刷新該配置才能生效:

2.4:更改hsitory的顯示格式: HISTTIMEFORMAT

[root@localhost ~]# HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S "    #直接給變量賦值便可:
[root@localhost ~]# history |tail -4                     #按年月日來顯示:
 1023  2018-07-04 11-39-25 history
 1024  2018-07-04 11-39-33 HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S "
 1025  2018-07-04 11-39-35 history
 1026  2018-07-04 11-39-40 history |tail -4
[root@localhost ~]# su - yuanhh                      #切換到另外一個普通用戶:
Last login: Wed Jul  4 11:28:53 CST 2018 on pts/1
[yuanhh@localhost ~]$ history                        #則不顯示:
    1  history \
    2  history
    3  echo $HISTSIZE
    4  EXIT
    5  exit
    6  history

如上:修改命令歷史的格式直接給其變量賦值便可,不過該格式只適用於當前終端,若是要其使用與全部用戶,則須要寫入到history的配置文件纔會生效:

[root@localhost ~]# vim /etc/profile             #修改此文件
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S"               #新增添加這一行了:
HISTSIZE=5000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
[root@localhost ~]# ^C
[root@localhost ~]# source /etc/profile
[root@localhost ~]# su - yuanhh                 #切換到普通用戶查看:
Last login: Wed Jul  4 11:37:41 CST 2018 on pts/0
[yuanhh@localhost ~]$ history                   #命令歷史顯示格式發生變化:
    1  2018-07-04 11-46-54history \
    2  2018-07-04 11-46-54history
    3  2018-07-04 11-46-54echo $HISTSIZE
    4  2018-07-04 11-46-54EXIT

2.5:命令歷史永久保存命令歷史只能寫入不能刪除

[root@localhost ~]# chattr +a /root/.bash_history
[root@localhost ~]# lsattr /root/.bash_history
-----a-------e-- /root/.bash_history

給文件增長+a權限,只能追加,不能刪除:也僅僅root用戶能夠操做:

三、!!命令:

!!:兩個歎號表示當前命令歷史中的最後一條命令:等同與上翻按鍵:

!n:n等於數字,表示命令歷史中的第n條命令:

!word:表示命令歷史中以該word命令開頭的命令:

[root@localhost ~]# pwd
/root
[root@localhost ~]# !!
pwd
/root
1033  2018-07-04 11-59-01ls
 1034  2018-07-04 11-59-06pwd
 1035  2018-07-04 11-59-56history
[root@localhost ~]# !1033               #表示第1033條命令:
ls
[root@localhost ~]# !p                  #表示以p開頭的命令:
pwd
/root

四、命令補全和別名:  tab     alias  unalias

tab:補全命令:須要安裝包:bash-completion   並從新啓動系統便可:

按一次tab:補全一個命令或者參數:

按兩次tab:補全某字母開頭的全部命令及文件名:

4.1:命令別名:alias    unalias

alias              命令別名="具體的命令"                   #設置別名:

unalias         命令別名                                          #取消別名:

[root@localhost ~]# alias p="pwd"             #設置別名」pwd「:
[root@localhost ~]# p
/root 
[root@localhost ~]# unalias p                 #取消別名:
[root@localhost ~]# p
-bash: p: command not found

4.2:輸入"alias"可查看系統中全部的別名:

[root@localhost ~]# 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'

4.2:系統別名的存放在配置文件~/.bashrc/etc/profile.d/下:

[root@localhost ~]# cat ~/.bashrc              #當前用戶下.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
[root@localhost ~]# ls /etc/profile.d/
256term.csh         colorls.csh         less.sh
256term.sh          colorls.sh          vim.csh
bash_completion.sh  lang.csh            vim.sh               
colorgrep.csh       lang.sh             which2.csh            
colorgrep.sh        less.csh            which2.sh

當前用戶目錄下的.bashrc只對當前用戶生效:

/etc/profile.d/目錄下的針對於系統中全部用戶生效:

五、通配符:  *     ?    [  ]     {    }

*表示匹配零個或多個字符

?表示匹配一個字符

[  ]表示匹配一個範圍,中括號區間內的任意一個文件

{  }表示匹配花括號內的任意一個文件

[root@localhost ~]# ls
1.txt  2.txt  3.txt  ba.txt.c  cat.txt  dir1  pk.txt
[root@localhost ~]# ls *.txt             #"*"匹配一個或者多個文件:
1.txt  2.txt  3.txt  cat.txt  pk.txt
[root@localhost ~]# ls *txt*
1.txt  2.txt  3.txt  ba.txt.c  cat.txt  pk.txt
[root@localhost ~]# ls       
1.txt  2.txt  3.txt  ba.txt.c  cat.txt  dir1  pk.txt
[root@localhost ~]# ls ?.txt               #」?「只匹配一個字符:
1.txt  2.txt  3.txt
[root@localhost ~]# ls
1.txt  3.txt  5.txt  ba.txt.c  dir1
2.txt  4.txt  6.txt  cat.txt   pk.txt
[root@localhost ~]# ls [1-5].txt          #表示匹配1--5之間的任意.txt文件:
1.txt  2.txt  3.txt  4.txt  5.txt
[root@localhost ~]# ls
1.txt  3.txt  5.txt  ba.txt.c  dir1
2.txt  4.txt  6.txt  cat.txt   pk.txt
[root@localhost ~]# ls {1,2,3}.txt          #匹配花括號內的txt文件:
1.txt  2.txt  3.txt

六、輸入輸出重定向:   >    >>   2>   2>>   &>     <

>:輸出重定向

>>:追加劇定向

2>:錯誤重定向

2>>:錯誤追加劇定向

&>:正確錯誤重定向

<:輸入重定向

5.1:使用">"這個命令時會將源文件內容刪除:

[root@localhost ~]# echo "111111" > 1.txt          #寫入文件:
[root@localhost ~]# cat 1.txt
111111
[root@localhost ~]# echo "222222" > 2.txt          #再次重定向寫入文件:
[root@localhost ~]# cat 2.txt                      #會刪除源文件:
222222

使用">>"至關於追加,不刪除源文件內容:

[root@localhost ~]# cat 2.txt
222222
[root@localhost ~]# echo "333333" >> 2.txt      #再次追加內容:
[root@localhost ~]# cat 2.txt                   #源文件內容不刪除:
222222
333333

錯誤重定向"2>"錯誤追加劇定向"2>>":

[root@localhost ~]# lsaaa              
-bash: lsaaa: command not found
[root@localhost ~]# lsaaa 2> 11.txt           #錯誤重定向:
[root@localhost ~]# cat 11.txt
-bash: lsaaa: command not found
[root@localhost ~]# ls222 2>> 11.txt          #錯誤追加劇定向:
[root@localhost ~]# cat 11.txt
-bash: lsaaa: command not found
-bash: ls222: command not found
[root@localhost ~]# ls 2> 11.txt             #此時輸入一個正確的命令:
11.txt  2.txt  4.txt  6.txt     cat.txt  pk.txt
1.txt   3.txt  5.txt  ba.txt.c  dir1
[root@localhost ~]# cat 11.txt              #查看時發現無內容,說明命令正確時是不會被重定向的:

也能夠同時使用重定向錯誤重定向

分別寫入到兩個文件1.txt2.txt

[root@localhost ~]# ls -ld 1.txt  aaa.txt >1.txt 2>2.txt
[root@localhost ~]# cat 1.txt            #正確的重定向在這裏:
-rw-r--r-- 1 root root 0 Jul  5 16:18 1.txt
[root@localhost ~]# cat 2.txt            #錯誤的重定向在這裏:
ls: cannot access aaa.txt: No such file or directory

如上:正確的文件寫入到1.txt裏,錯誤的則寫入到2.txt文件下:

也能夠寫入到同一個1.txt文件裏

[root@localhost ~]# ls -ld 1.txt  aaa.txt   &> 1.txt
[root@localhost ~]# cat 1.txt       #正確和錯誤都輸出到同一個文件裏:
ls: cannot access aaa.txt: No such file or directory
-rw-r--r-- 1 root root 0 Jul  5 16:23 1.txt

#等同於下面的命令:
[root@localhost ~]# ls -ld 1.txt  aaa.txt   > 1.txt 2>&1    #&1:表示前面的1.txt文件:
[root@localhost ~]# cat 1.txt
ls: cannot access aaa.txt: No such file or directory
-rw-r--r-- 1 root root 0 Jul  5 16:24 1.txt

#命令中"&1"表示前面的1.txt文件:

輸入重定向:"<"輸入重定向的左邊必須是一個命令:用的較少:

[root@localhost ~]# wc -l < 1.txt
2
相關文章
相關標籤/搜索