Linux基礎學習筆記(二 理解shell)

Linux(基於《Linux命令行與shell腳本編程大全》的學習筆記)


5 理解shell

shell類型

系統啓動什麼樣的shell程序取決於你我的的用戶ID配置,在/etc/passwd文件中,在用戶ID記錄的第7個字段中列出了默認的shell程序。只要用戶登陸,默認的shell就開始運行shell

root:x:0:0:root:/root:/bin/bash

以上是passwd中的一段內容,上面的例子中就是使用了GUN bash shell 做爲本身的默認shell程序,還有幾種不經常使用的shell分別是編程

tcsh、dash、csh(有的可能已經消失,不一樣版本也不同)
Ubuntu系統中使用dash做爲默認shell

這些shell程序各自均可以被設置成用戶的默認shell。因爲bash shell應用較廣,通常都使用bashbash

使用以下命令能夠查看系統默認shell
ls -l /usr/bin/sh
也可使用 /usr/bin/dash來直接啓動dash shell(若是dash存在的話)

shell的父子關係

每次用戶登陸都會根據passwd中指定的shell類型啓動一個shell程序,好比我如今使用的是bash shell那麼就會啓動,再輸入等效的bash命令就會建立一個新的shell程序,這個程序被稱爲子shell,執行兩次bash命令後使用ps -f查看以下:
第二列bash的ppid爲第一個的pid,第三個的ppid爲第二個的pid,咱們再執行的ps命令實際上是再第三個子bash中執行的性能

UID PID PPID C STIME TTY TIME CMD
root 26695 26692 0 16:42 pts/1 00:00:00 -bash
root 29198 26695 0 17:05 pts/1 00:00:00 bash
root 29226 29198 0 17:05 pts/1 00:00:00 bash
root 29246 29226 0 17:05 pts/1 00:00:00 ps -f

這樣還不夠直觀,再使用ps中GUN長參數:ps --forest學習

PID TTY TIME CMD
26695 pts/1 00:00:00 bash
29198 pts/1 00:00:00 --\_ bash
29226 pts/1 00:00:00 ----\_ bash
30893 pts/1 00:00:00 ------\_ ps

此次能夠看到他們之間的父子關係
可使用exit來退出子shellui

進程列表

能夠在一行中經過分號';' 隔開須要依次執行的命令命令行

pwd;ls;cd /etc;ll

上面這些例子全部的命令依次執行,但這並非進程列表,命令列表若要成爲進程列表,命令必須包在括號中rest

(pwd;ls;cd /etc;ll)

所謂的進程列表就是建立一個子shell來執行進程列表
咱們經過環境變量命令 echo $BASH_SUBSHELL 來查看是否存在子shell,返回子shell的個數
當咱們執行一個命令列表協程

pwd;ls;cd /etc;ll;echo $BASH_SUBSHELL

能夠看到在命令最後顯示的數字爲0,說明沒有建立子shell
執行一個進程列表進程

(pwd;ls;cd /etc;ll;echo $BASH_SUBSHELL)

(pwd;ls;cd /etc;ll;(echo $BASH_SUBSHELL))

第一個進程列表結果爲1,第二個爲2,注意括號的數量

後臺模式

sleep 命令

sleep [second] ,sleep 10 就是暫停十秒
sleep 1000 & 就是將sleep 命令置入後臺運行 ,執行後會出現兩條信息,第一個是在方括號中的後臺做業job號,第二條是後臺做業的進程id

在sleep 計時結束前使用 jobs命令能夠看到運行在後臺模式的進程jobs -l
通常狀況下子shell的做用是進行繁重的處理工做,又不影響當前中端的操做,常見應用場景爲解壓、編譯、打包等操做中

子shell 的另外一種用法---協程

協程coproc能夠同時作兩件事,他能夠在後臺生成一個子shell,並在這個子shell中執行命令

coproc sleep 10

執行上面的命令,使用jobs查看子shell進程能夠看到

[1]+ Running coproc COPROC sleep 10 &

上面的例子能夠看出在執行子shell中後臺的執行命令是coproc COPROC sleep 10 & COPROC是協程命令給進程的默認名稱,咱們也能夠指定該名稱

coproc My_Job { sleep 10; }

注意上面的命令的格式,若是使用擴展名,必須保證命令以;結尾,命令和兩邊的花括號有一個空格。若是使用多個協程,就須要對協程進行命名,否則名稱會衝突,下面就是我嘗試建立第二個協程的時候出現的警告。

coproc [24257:COPROC] still exists

也能夠同時使用協程和上面的進程列表產生嵌套的子shell

coproc ( sleep 10; sleep 2; )

可是儘可能不要使用嵌套,性能很是差!

外部命令

外部命令,又稱做文件系統命令,是存在與bash shell以外的程序。他們並非shell程序的一部分,外部命令程序京城位於/bin 、/sbin 中,ps就是一個外部命令,可使用which 或者 tupe 命令找到他

which ps
/usr/bin/ps
type -a ps
ps is /usr/bin/ps

當外部命令執行時,會建立出一個子進程,這個子進程的父進程就是當前的bash shell

內建命令

內建命令是bash shell 中自帶的命令,經過type 命令能夠了解命令是否爲內建命令

type cd;type type
cd is a shell builtin
type is a shell builtin

有些命令有多種實現,使用type -a能夠查看命令的不一樣實現

history 命令

history 命令能夠查看最近使用過的命令列表,默認保存1000條最近使用記錄。若是要修改最大記錄數,能夠修更名爲HISTSIZE的環境變量,命令歷史保存在隱藏文件.bash_history中,這個文件位於用戶主目錄中,bash歷史命令先保存在內存中,在shell退出後才被寫入到歷史文件中,若是須要強制寫入則可使用history -a命令,當存在多個bash客戶端的時候,其餘客戶端的命令歷史是不會經過history -a命令寫入的,須要另外一個命令history -n

咱們知道經過執行!!能夠執行上一條命令,因此!20就是執行history記錄中第20條記錄

命令別名

alias 命令能夠爲經常使用命令(及參數)建立另外一個名稱,好比咱們熟知的ls命令就是一個內置的別名命令

alias -p 能夠查看當前可用的別名
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 li='ls -li'

相關文章
相關標籤/搜索