一、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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
