2018-05-30筆記(Linux shell基礎知識)
8.1 shell介紹
在計算機科學中,Shell俗稱殼(用來區別於核),是指“提供使用者使用界面”的軟件(命令解析器)。它類似於DOS下的command.com和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。同時它又是一種程序設計語言。作為命令語言,它交互式解釋和執行用戶輸入的命令或者自動地解釋和執行預先設定好的一連串的命令;作為程序設計語言,它定義了各種變量和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。CentOS7的默認shell為bash(Bourne Agin Shell),常見的還有zsh(power-shell)、ksh(Korn shell)
8.2 命令歷史(history)
history命令用於顯示指定數目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區和將歷史命令緩沖區中的目錄寫入命令文件。
語法
history(選項)(參數)
選項
-c:清空當前歷史命令;
-a:將歷史命令緩沖區中命令寫入歷史命令文件中;
-r:將歷史命令文件中的命令讀入當前歷史命令緩沖區;
-w:將當前歷史命令緩沖區命令寫入歷史命令文件中。
參數
n:打印最近的n條歷史命令。
實例
使用history命令顯示最近使用的10條歷史命令,輸入如下命令:
[root@localhost ~]# history 10 92 ls 93 cd .. 94 ls 95 exit 96 ls -a 97 cd .ssh/ 98 ls 99 cat known_hosts 100 exit 101 history 10
歷史命令是被保存在內存中的,當退出或者登錄shell時,會自動保存或讀取。在內存中,歷史命令默認僅能夠存儲1000條歷史命令,該數量是由環境變量HISTSIZE進行控制。
定義變量HISTSIZE
編輯其配置文件/etc/profile
[root@localhost ~]# vim /etc/profile …… HISTSIZE=2000 #####這裏修改為2000 …… [root@localhost ~]# echo $HISTSIZE ######這裏還是顯示1000,用source運行下/etc/profile文件 1000 [root@localhost ~]# source /etc/profile [root@localhost ~]# echo $HISTSIZE 2000
找到‘HISTSIZE=1000’,在此更改為你想要保存的數量,保存退出,然後執行命令‘source /etc/profile’刷新該配置文件才會生效。
更改history顯示格式
[root@localhost ~]# echo $HISTTIMEFORMAT
[root@localhost ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
[root@localhost ~]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S
[root@localhost ~]# history
1 2018/06/01 22:50:11 history
2 2018/06/01 22:51:32 echo $HISTTIMEFORMAT
3 2018/06/01 22:51:43 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
4 2018/06/01 22:51:45 echo $HISTTIMEFORMAT
5 2018/06/01 22:52:32 history
直接為‘HISTTIMEFORMAT’賦值即可,不過此時該格式只適用於當前終端。如果要其使用於所有用戶,則需要將其寫入/etc/profile配置文件並刷新後生效。
[root@localhost ~]# vim /etc/profile
……
HISTSIZE=1000
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
……
保存退出!
[root@adai003 ~]# source /etc/profile
命令歷史永久保存
即,使命令歷史記錄只能寫入不能被刪除!
[root@localhost ~]# chattr +a ~/.bash_history
使用文件特殊權限,為‘.bash_history’文件配置‘a’權限(只可追加,不可刪除)
‘!!’命令
!!命令表示執行上一條運行的命令
[root@localhost ~]# w
14:58:29 up 13 min, 1 user, load average: 0.00, 0.01, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.1 14:45 5.00s 0.01s 0.00s w
[root@localhost ~]# !! #可以看到上一條命令為w,這裏輸入!!也是執行w
w
14:58:32 up 13 min, 1 user, load average: 0.00, 0.01, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.1 14:45 0.00s 0.01s 0.00s w
‘!’的用法:‘!n’(n代表數字),表示運行命令歷史中的第n條命令;‘!word’,表示運行上一次以該word開頭的命令。
[root@localhost tmp]# history
1 history
2 ls
3 cd /tmp
4 touch 1.txt
5 history
[root@localhost tmp]# !2 #命令歷史中第2條為ls
ls
1.txt
3.txt
3.txt.gz
[root@localhost tmp]# !history #運行以history開頭的命令
history
1 history
2 ls
3 cd /tmp
4 touch 1.txt
5 history
6 ls
7 history
8.3 命令補全和別名
命令補全Tab
按一次tab可以補全一個命令或參數(需要安裝包bash-completion,並重啟系統);按兩次tab可以顯示以某字母開頭的所有命令或文件名。
alias命令
語法: alias [命令別名]=[具體命令] 設置別名
取消別名:unalias [命令別名]
直接輸入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‘
設置別名
[root@localhost ~]# alias mysql=‘/usr/local/mysql/bin/mysql‘ #除了可以把絕對路徑加到PATH裏,還可以把絕對路徑設置別名
取消別名
[root@localhost ~]# unalias mysql
只對當前shell有效,要想永久生效可以把別名存放在配置文件‘~/.bashrc’(用戶家目錄下,只針對當前用戶)和‘/etc/profile.d/’(針對所有用戶,系統級別的)下:
[root@localhost ~]# 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
[root@localhost ~]# cat /etc/profile.d/
256term.csh colorgrep.sh lang.csh less.sh which2.csh
256term.sh colorls.csh lang.sh vim.csh which2.sh
colorgrep.csh colorls.sh less.csh vim.sh
[root@localhost ~]# cat /etc/profile.d/vim.sh
if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
[ -x /usr/bin/id ] || return
ID=`/usr/bin/id -u`
[ -n "$ID" -a "$ID" -le 200 ] && return
# for bash and zsh, only if no alias is already set
alias vi >/dev/null 2>&1 || alias vi=vim
fi
8.4 shell中的特殊符號
通配符‘*’代表零個或多個任意字符
通配符‘?’代表一個任意字符
中括號‘[]’,“ls [0-9].txt”表示0-9區間內的任意.txt文件
花括號‘{}’,“ls {1,2,3}.txt”表示括號內任意.txt文件
[root@localhost ~]# ll
總用量 152
-rw-r--r-- 1 root root 0 6月 2 15:19 123.txt
-rw-r--r-- 1 root root 81 5月 20 15:19 1.sh
-rw-r--r-- 1 root root 0 5月 12 18:38 1.txt
-rw-r--r-- 1 root root 0 6月 2 15:19 22.txt
-rwxr-xr-x 1 root root 204 5月 20 16:03 2.sh
-rw-r--r--. 1 root root 41 4月 30 19:56 2.txt
-rw-r--r-- 1 root root 0 6月 2 15:19 333.txt
[root@localhost ~]# ll *.txt ###*可以匹配0個或者多個.txt結尾的
-rw-r--r-- 1 root root 0 6月 2 15:19 123.txt
-rw-r--r-- 1 root root 0 5月 12 18:38 1.txt
-rw-r--r-- 1 root root 0 6月 2 15:19 22.txt
-rw-r--r--. 1 root root 41 4月 30 19:56 2.txt
-rw-r--r-- 1 root root 0 6月 2 15:19 333.txt
[root@localhost ~]# ll ?.txt ###?問號只能匹配一個
-rw-r--r-- 1 root root 0 5月 12 18:38 1.txt
-rw-r--r--. 1 root root 41 4月 30 19:56 2.txt
[root@localhost ~]# ls [0-9].txt ###[0-9]表示中括號中0到9區間中的任意一個數字,[12]表示1或者2,不是12,
1.txt 2.txt
[root@localhost ~]# ls {1,2,3}.txt ###{1,2,3}中間用逗號分隔,表示括號內任意.txt文件,也可以用{1..10}表示一個區間
ls: 無法訪問3.txt: 沒有那個文件或目錄
1.txt 2.txt
8.5輸入輸出重定向
“>,>>,<,2>,2>>”
‘>’:輸出重定向
‘>>’:追加重定向
‘2>’:錯誤重定向
‘<’:輸入重定向
使用‘>’命令時會將文件內原有內容刪除。
[root@localhost ~]# echo aaaa >1.txt
[root@localhost ~]# cat 1.txt
aaaa
[root@localhost ~]# echo bbb >1.txt
[root@localhost ~]# cat 1.txt
bbb
[root@localhost ~]# echo ccc >>1.txt
[root@localhost ~]# cat 1.txt
bbb
ccc
[root@localhost ~]# ls 1.txt 2.txt 3.txt 1>1.log 2>1.log #把正確輸出和錯誤輸出都重定向到1.txt裏面,也可這樣2>&1
[root@localhost ~]# cat 1.log
1.txt
2.txt
ls: 無法訪問3.txt: 沒有那個文件或目錄
8.6 管道符和作業控制
linux中管道符“|”的作用
命令格式:命令A|命令B,即命令A的正確輸出作為命令B的操作對象(下圖應用別人的圖片)
例如:
[root@localhost ~]# ls |grep txt
123.txt
1,txt
1.txt
22.txt
2.txt
333.txt
作業控制
Ctrl+z 暫停一個正在執行的任務
jobs 查看在後臺運行的任務
bg[id] =background把任務調到後臺運行
fg[id] =foreground把任務調到前臺運行
“&” 命令後面加&相當於直接把任務調到後臺運行
[root@localhost ~]# vi 1.txt ####按CTRL+z暫停
[1]+ 已停止 vi 1.txt
[root@localhost ~]# jobs #####jobs查看後臺運行的任務
[1]+ 已停止 vi 1.txt
[root@localhost ~]# fg 1 #####fg把作業調回前臺運行
vi 1.txt
[1]+ 已停止 vi 1.txt
[root@localhost ~]# bg 1 ####bg把作業放到後臺運行,運行一條命令的時候,可以直接在命令後面加&,把命令直接放到後臺運行
[1]+ vi 1.txt &
[1]+ 已停止 vi 1.txt
8.7-8.8 shell變量
env命令:查看系統內置環境變量
[root@localhost ~]# env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.66.1 50517 22
SSH_TTY=/dev/pts/0
HISTORY_FILE=/usr/local/domob/records/root/bash_history
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
。。。。
還可以使用set命令查看shell變量,該命令不僅可以顯示系統內置環境變量,還可以顯示用戶自定義的環境變量。
[root@localhost ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION=‘4.2.46(2)-release‘
COLUMNS=103
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTORY_FILE=/usr/local/domob/records/root/bash_history
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$‘ \t\n‘
LANG=zh_CN.UTF-8
LESSOPEN=‘||/usr/bin/lesspipe.sh %s‘
LINES=41
LOGNAME=root
LS_COLORS=‘rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:‘
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/tmp
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=840
PROMPT_COMMAND=‘{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE‘
PS1=‘[\u@\h \W]\$ ‘
PS2=‘> ‘
PS4=‘+ ‘
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT=‘192.168.66.1 50517 22‘
SSH_CONNECTION=‘192.168.66.1 50517 192.168.66.130 22‘
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=env
colors=/root/.dircolors
自定義變量
[root@localhost ~]# a=22222 #####直接給a賦值
[root@localhost ~]# echo $a
22222
變量名規則: 字母、數字下劃線,首位不能為數字;變量值有特殊符號時需要用單引號括起來(單引號有脫意功能)。
變量累加
[root@localhost ~]# a=123
[root@localhost ~]# b=456
[root@localhost ~]# echo $a$b
123456
[root@localhost ~]# c="$a$b"789
[root@localhost ~]# echo $c
123456789
註: 多個變量進行疊加時需要對目標變量(等號右邊)加上雙引號,並且當在對新的變量附加新的值的時候寫法: c="$a$b"789。
全局變量
export
當在一個父shell下設定一個變量後,進入子shell該變量並不生效,如果想讓該變量在子shell下生效需要使用export聲明一下才可以(跨終端不生效)。 語法: export [變量名]
當export不指定變量時,它會聲明系統所有變量。
[root@localhost ~]# a=22222
[root@localhost ~]# echo $a
22222
[root@localhost ~]# export a=22222
[root@localhost ~]# echo $a
22222
[root@localhost ~]# bash
[root@localhost ~]# echo $a
22222
說明: 當在子shell設定變量後即便聲明後也不能在父shell生效。
當打開多個終端的時候,使用查看$SSH_TTY變量查看當前所在終端:
[root@localhost ~]# w
16:37:28 up 1:52, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.1 14:45 0.00s 0.13s 0.00s w
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0
bash命令&pstree命令
[root@localhost ~]# bash
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─2*[sendmail]
├─sshd───sshd───bash─┬─bash───pstree
│ └─vi
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
在當前shell中國運行bash命令會進入一個新的shell,這個shell是原來shell的子shell,可以使用pstree命令把系統中所有進程以樹狀圖結構打印出來,pstree所在行顯示的即為當前所在shell(exit可以退出子shell)。
刪除變量 unset
[root@localhost ~]# set
....
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=bash
a=22222
[root@localhost ~]# unset a 刪除a變量
....
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=bash
8.9 環境變量配置文件
環境變量配置文件可劃分為兩個維度:系統環境變量配置文件和用戶環境變量配置文件。
系統配置文件
/etc/profile 用戶環境變量,交互,登錄才執行
/etc/bashrc 用戶不用登錄,執行shell就生效
用戶配置文件
~/.bashrc
~/.bash_profile
~/.bash_history
~/.bash_logout 在此可以設定退出登錄時系統執行的操作(如清除緩存、清除歷史記錄等等)
變量PS1------定制linux shell提示符
該變量用於定義“[root@localhost ~]# ”此部分顯示內容,默認為 PS1="[\u@\h \W]\$ "
“PS1=‘\ [\033[01;32m\ ]\u@\h\ [\033[00m\ ]:\ [\033[01;36m\ ]\w\ [\033[00m\ ] \ $ ‘ ” 帶顏色顯示
2018-05-30筆記(Linux shell基礎知識)