鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號展開與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號 trap

shell 學(xué)習(xí)第二天

腳本位于第一行的 #!

當(dāng) shell 執(zhí)行一個(gè)程序時(shí),會要求 linux 內(nèi)核啟動一個(gè)新的進(jìn)程,以便在該進(jìn)程里執(zhí)行所指定的程序。 內(nèi)核知道如何為編譯性程序做這件事。 但是我們的nusers Shell 腳本并非編譯性程序; 當(dāng) shell 要求內(nèi)核執(zhí)行它的時(shí)候,內(nèi)核無法處理,并且回應(yīng)“not executable format file”,接著會啟動一個(gè)新的 /bin/sh(標(biāo)準(zhǔn) shell) 副本來執(zhí)行該程序。

當(dāng)系統(tǒng)只有一個(gè) shell 是,“退回到 /bin/sh” 的機(jī)制很方便。 但是現(xiàn)在的 linux 都擁有好幾個(gè) shell,因此需要通過一宗方式,告知 linux 內(nèi)核用哪個(gè) shell 來執(zhí)行所指定的 shell 及哦啊本。

linux 有多個(gè) shell 帶來的好處是有助于執(zhí)行機(jī)制通用化,讓用戶得以直接引用任何程序語言解釋器,而非只是一個(gè)命令 shell。

例如:文件開頭存在 \#!/bin/csh 則說明執(zhí)行的是 csh 腳本,相同的,例如我們可以這樣引用獨(dú)立的 awk 程序:

\#! /bin/awk -f
此處是 awk 程序
shell 腳本的第一行通常是 #!/bin/sh。如果不這樣是不符合標(biāo)準(zhǔn)的,自覺修改這個(gè)路徑,將其改為符合 POSIX 標(biāo)準(zhǔn)的 shell。

以下是幾個(gè)初級的陷阱:

  1. #! 這一行的長度盡量不要超過 64 個(gè)字符
  2. 腳本的可移植性取決于是否有完整的路徑名稱
  3. 不要在選項(xiàng)之后放置任何空白,因?yàn)榭瞻滓矔x項(xiàng)一起傳遞給被引用的程序
  4. 需要知道解釋器的完成路徑的名稱。 這樣可以規(guī)避可移植性的問題, 廠商不同,同樣的東西可能放在不同的地方
  5. 一些較久的系統(tǒng),內(nèi)核不具備 #! 的能力,有些 shell 會自行處理,這些 shell 對于 #! 與緊隨其后的解釋器名稱之間是否可以有空白,可能有不同的解釋

查看當(dāng)前發(fā)行版本可以使用的 shell;cat/etc/shells 查看系統(tǒng)默認(rèn)的 shell;echo $SHELL; 一般情況下是輸出 /bin/bash。如果想切換 shell 的版本,只需要直接輸入 shell 的版本。 例如想使用 csh,直接輸入 csh 即可,使用 exit 退出當(dāng)前 shell 回到原 shell。