一、shell的基本概念: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
shell? 意思 是外殼,它是 離用戶最近的程序。shell提供用戶操作系統的接口, 我們通過 shell 將輸入的命令與 內核 通信,使內核可以控制 硬件 來正確無誤的工作。廣義上的shell包含兩類GUI和CLI。
GUI:Gnome,KDE,Xface
CLI:sh,csh,ksh,bash,tcsh,zsh(合法的shell要寫入/etc/shells這個文件,系統某些服務在運行過程中,可能會去檢查用戶能夠使用的shell)
當用戶登陸的時候,系統會分配一個shell來進行工作。默認會取得的shell記錄在/etc/passwd文件中,可以看到hao這個用戶默認取得的是bash。
[hao@hao ~]$
cat
/etc/
passwd
root:x:
0
:
0
:root:/root:/bin/
bash
bin:x:
1
:
1
:bin:/bin:/sbin/
nologin
...
hao:x:
500
:
500
:haohao:/home/hao:/bin/bash
當有多個用戶登陸的時候,會有多個進程,進程之間彼此互不相干,因為對于每個進程來說,它只認為當前主機上只有自己和內核存在。linux允許一個用戶賬號登陸多次 。
進程是程序的副本,進程是程序執行的實例,是有生命周期的,由內核進行管理。
用戶工作環境,多個用戶盡管使用的都是shell程序,但是各個用戶的工作環境設定卻可以各不相同,只不過默認情況下除了管理員,都是一樣的。
shell,子shell。可以在一個shell中在啟動一個子shell。父shell和子shell都不能意識到彼此正在運行。很多時候對父shell的設定對子shell無效,子shell的設定對父shell也無效。下面的通過pstree命令可以看出該關系,如果退出到上一層bash,可以用exit命令。退到最上一層時候,會退出當前登陸。
[hao@hao ~
]$
bash
[hao@hao
~
]$
pstree
init
-+-NetworkManager-+-
dhclient
| `-
{NetworkManager}
|-
abrtd
|-
acpid
...
|-sshd---sshd---sshd---bash---bash---pstree
|-
trashapplet
...
[hao@hao
~
]$
bash
[hao@hao
~
]$
pstree
init
-+-NetworkManager-+-
dhclient
| `-
{NetworkManager}
|-
abrtd
|-
acpid
...
|-sshd---sshd---sshd---bash---bash---bash---pstree
|-
trashapplet
...
當然,bash下也可以嵌套運行csh,ksh
[hao@hao ~
]$
pstree
init
-+-NetworkManager-+-
dhclient
| `-
{NetworkManager}
|-
abrtd
|-
acpid
|-
atd
...
|-sshd---sshd---sshd---bash---pstree
|-udevd---
2
*
[udevd]
`
-
wpa_supplicant
[hao@hao
~
]$
csh
[hao@hao
~
]$
pstree
init
-+-NetworkManager-+-
dhclient
| `-
{NetworkManager}
|-
abrtd
|-
acpid
|-
atd
...
|-sshd---sshd---sshd---bash---csh---pstree
|-udevd---
2
*
[udevd]
`
-wpa_supplicant
二、為什么學習shell ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
- 一法通,萬法通。雖然X Window將所有用到的軟件都集成在一起,但它并非是一個完整的套件,所以某些時候當升級或者使用其他套件管理模塊時,會遇到一些麻煩。
- 遠程管理:命令行界面比較快。Linux的管理經常需要遠程聯機,聯機時命令行界面的傳輸速度比較快,而且較不容易出現斷線或者信息外流。
三、shell的特性???????????????????????????????? :
1、命令歷史、命令補全
默認的命令記憶功能可以達到1000(環境變量HISTSIZE保存該數值)個,前一次登陸以前所執行過的命令歷史記錄在~/.bash_history,而本次登陸所執行的命令都被暫存在臨時內存中,當注銷后,該命令記憶才會被記錄到~/.bash_history當中。
查看命令歷史(包含本次執行的history命令):history
-c(clear):清空命令歷史
-d offset [n]:刪除第offset條命令,history -d 500 10從第五百條命令往后刪10條
-w(wriet):將當前緩沖區中歷史命令寫入到歷史文件中去。
n(number):列出最近的n條命令行。
history歷史命令的使用技巧:
!n:執行命令歷史的第number命令
!-n:執行命令歷史記錄的倒數第n條命令。
!!:執行上一條命令。
!vi:執行命令歷史中最近一個以vi開頭的命令。
[hao@hao ~
]$ history
1
ll etc/
...
141
ls
-
a
142
LANG=
en
143
ls
-
a
144
ll ~/
.bash_history
145
cat
~/
.bash_history
146
man
history
147
history -
w
148
history
149
cat
~/
.bash_history
150
history
[hao@hao
~]$ !
141
ls
-
a
. .bash_history .cache .gconf .gnote .gvfs .mozilla .recently
-used.xbel .xsession-errors.old ?????? ??????
.. .bash_logout .config .gconfd .gnupg .history .nautilus .
ssh
?????? ??????
.ICEauthority .bash_profile .dbus .gnome2 .gstreamer
-
0.10
.imsettings.log .pulse .viminfo ????????? ??????
.abrt .bashrc .esd_auth .gnome2_private .gtk
-bookmarks .local .pulse-cookie .xsession-errors ?????? ??????
命令補全:命令補全是在PATH環境變量下搜索命令。tab鍵自動補全(唯一),連敲兩下tab鍵可以搜索所有已所敲字符為開頭的命令。
2、管道、重定向
3、命令別名
root@hao:~
#
alias
alias
egrep
=
'
egrep --color=auto
'
alias
fgrep
=
'
fgrep --color=auto
'
alias
grep
=
'
grep --color=auto
'
alias l
=
'
ls -CF
'
alias la
=
'
ls -A
'
alias ll
=
'
ls -alF
'
alias
ls
=
'
ls --color=auto
'
alias CMDALIAS='COMMAND [options] [arguments]'
root@hao:~#
alias cls=
'
clear
'
在shell中定義的別名只在當前shell的生命周期中有效,別名的有效范圍為當前shell進程,即使相同的用戶在另一個shell中。若想讓該別名永久有效,只需要將該別名寫入shell應用程序的配置文件。
撤銷命令別名:unalias CMDALIAS;
如果命令別名與原命令是一個名字,但是命令別名加入了一些選項。若此時想使用原命令,則需要使用\COMMAND。
4、命令替換
把命令中某個子命令替換為其執行結果的過程叫做命令替換,如下面把子命令pwd的執行結果替換為命令echo的執行結果。
格式$(command)或者`command`
hao@hao:~$
pwd
/home/
hao
hao@hao:
~$
echo
"
This current /home/hao
"
This current
/home/
hao
hao@hao:
~$
cd /etc/sysctl.d/
hao@hao:/etc/sysctl.d$
echo
"
This current directory is $(pwd).
"
This current directory is
/etc/
sysctl.d.
hao@hao:
/etc/
sysctl.d$
cd
hao@hao:
~$
echo
"
This current directory is $(pwd).
"
This current directory is
/home/hao.
在當前目錄下(./)創建一個以當前時間命名的txt文件。
hao@hao:~$
touch
./
file
-$(
date
+%F-%H-%M-%
S).txt
hao@hao:
~$
ls
examples.desktop
file
-
2014
-
08
-
01
-
16
-
52
-
15
.txt ?????? ????????? ?????? ?????? ?????? ?????? ?????? ??????
hao@hao:~$
補充,bash支持的三種引號:
- 單引號'':強引用,不完成變量替換
- 雙引號"":弱引用,可以實現變量替換
- 反引號``:命令替換
5、命令行編輯
光標跳轉:
ctrl+a跳到行首
ctrl+e跳到行尾
ctrl+u刪除光標至命令行首的內容
ctrl+k刪除光標至命令行尾的內容
ctrl+->向右跳轉一個單詞
ctrl+<-向左跳轉一個單詞
ctrl+l清屏
6、命令行展開
7、文件名通配,globbing
*: 任意長度的任意字符。/root/test目錄下以a開始的任意文件
root@hao:~/test#
tree /
root
/
root
|--
m
| `--
n
| `--
t
`
--
test
|--
a
|--
a123
|--
ab123
|--
abc
|--
x12
|--
xyz
`
--
xyz123
4
directories,
7
files
root@hao:
~/test#
ls
a*
a a123 ab123 abc
?: 匹配任意單個字符。文件名第二個字符是y的文件
root@hao:~/test#
ls
?y*
xyz xyz123
[]: 匹配指定范圍內的任意單個字符。 以字母開頭,數字結尾的文件。還有一些特殊字符,可以使用man 7 glob查看,常用的如下。
- [[:space:]], 空白字符
- [[:punct:]], 標點符號
- [[:lower:]], 小寫字符
- [[:upper:]], 大寫字母
- [[:alpha:]], 大小寫字母
- [[:diget:]], 數字
- [[:alnum:]],字母和數字
,root@hao:~/test#
ls
[a-zA-Z]*[
0
-
9
]
a123 ab123 x12 xyz123
以字母開頭和結尾的文件名中間包含空格的文件
root@hao:~/test#
touch
'
a b
'
root@hao:~/test#
ls
a b a123 ab123 abc x12 xyz xyz123
root@hao:~/test#
ls [[:alpha:]]*[[:space:]]*
[[:alpha:]] a
[^]: 匹配指定范圍之外的任意單個字符。以非a開頭的所有文件
root@hao:~/test#
ls
[^a]*
x12 xyz xyz123
8、變量
9、編程
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

