<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 10.1 認識 BASH 這個 Shell 我們在[第一章 Linux 是什么](../Text/index.html)當中提到了: 管理整個計算機硬件的其實是操作系統的核心 (kernel),這個核心是需要被保護的! 所以我們一般使用者就只能通過 shell 來跟核心溝通,以讓核心達到我們所想要達到的工作。 那么系統有多少 shell 可用呢?為什么我們要使用 bash 啊?下面分別來談一談喔! ### 10.1.1 硬件、核心與 Shell 這應該是個蠻有趣的話題:“什么是 Shell ”?相信只要摸過計算機,對于操作系統 (不論是 Linux 、 Unix 或者是 Windows) 有點概念的朋友們大多聽過這個名詞,因為只要有“操作系統”那么就離不開 Shell 這個東西。不過,在討論 Shell 之前,我們先來了解一下計算機的運行狀況吧! 舉個例子來說:當你要計算機傳輸出來“音樂”的時候,你的計算機需要什么東西呢? 1. 硬件:當然就是需要你的硬件有“聲卡芯片”這個配備,否則怎么會有聲音; 2. 核心管理:操作系統的核心可以支持這個芯片組,當然還需要提供芯片的驅動程序啰; 3. 應用程序:需要使用者 (就是你) 輸入發生聲音的指令啰! 這就是基本的一個輸出聲音所需要的步驟!也就是說,你必須要“輸入”一個指令之后, “硬件”才會通過你下達的指令來工作!那么硬件如何知道你下達的指令呢?那就是 kernel (核心) 的控制工作了!也就是說,我們必須要通過“ Shell ”將我們輸入的指令與 Kernel 溝通,好讓 Kernel 可以控制硬件來正確無誤的工作! 基本上,我們可以通過下面這張圖來說明一下: ![硬件、核心與使用者的相關性圖示](https://box.kancloud.cn/2016-05-13_5735737674f21.jpg)圖10.1.1、硬件、核心與使用者的相關性圖示 我們在[第零章內的操作系統小節](../Text/index.html#program_os)曾經提到過, 操作系統其實是一組軟件,由于這組軟件在控制整個硬件與管理系統的活動監測, 如果這組軟件能被使用者隨意的操作,若使用者應用不當,將會使得整個系統崩潰!因為操作系統管理的就是整個硬件功能嘛! 所以當然不能夠隨便被一些沒有管理能力的終端用戶隨意使用啰! 但是我們總是需要讓使用者操作系統的,所以就有了在操作系統上面發展的應用程序啦!使用者可以通過應用程序來指揮核心, 讓核心達成我們所需要的硬件任務!如果考慮如[第零章所提供的操作系統圖示(圖0.4.2)](img/os_01.gif), 我們可以發現應用程序其實是在最外層,就如同雞蛋的外殼一樣,因此這個咚咚也就被稱呼為殼程序 (shell) 啰! 其實殼程序的功能只是提供使用者操作系統的一個接口,因此這個殼程序需要可以調用其他軟件才好。 我們在第四章到第九章提到過很多指令,包括 man, chmod, chown, vi, fdisk, mkfs 等等指令,這些指令都是獨立的應用程序, 但是我們可以通過殼程序 (就是命令行界面) 來操作這些應用程序,讓這些應用程序調用核心來運行所需的工作哩! 這樣對于殼程序是否有了一定的概念了? ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 也就是說,只要能夠操作應用程序的接口都能夠稱為殼程序。狹義的殼程序指的是命令行方面的軟件,包括本章要介紹的 bash 等。 廣義的殼程序則包括圖形接口的軟件!因為圖形接口其實也能夠操作各種應用程序來調用核心工作啊! 不過在本章中,我們主要還是在使用 bash 啦! ### 10.1.2 為何要學命令行的 shell? 命令行的 shell 是很不好學的,但是學了之后好處多多!所以, 在這里鳥哥要先對您進行一些心理建設,先來了解一下為啥學習 shell 是有好處的,這樣你才會有信心繼續玩下去 ^_^ * 命令行的 shell:大家都一樣! 鳥哥常常聽到這個問題:“我干嘛要學習 shell 呢? 不是已經有很多的工具可以提供我設置我的主機了?我為何要花這么多時間去學指令呢?不是以 X Window 按一按幾個按鈕就可以搞定了嗎?”唉~還是得一再地強調, X Window 還有 Web 接口的設置工具例如 Webmin [[1]](#ps1) 是真的好用的家伙, 他真的可以幫助我們很簡易的設置好我們的主機,甚至是一些很進階的設置都可以幫我們搞定。 但是鳥哥在前面的章節里面也已經提到過相當多次了, X Window 與 web 接口的工具,他的接口雖然好友,功能雖然強大, 但畢竟他是將所有利用到的軟件都整合在一起的一組應用程序而已, 并非是一個完整的套件,所以某些時候當你升級或者是使用其他套件管理模塊 (例如 tarball 而非 rpm 文件等等) 時,就會造成設置的困擾了。甚至不同的 distribution 所設計的 X window 接口也都不相同,這樣也造成學習方面的困擾。 命令行的 shell 就不同了!幾乎各家 distributions 使用的 bash 都是一樣的!如此一來, 你就能夠輕輕松松的轉換不同的 distributions ,就像武俠小說里面提到的“一法通、萬法通!” * 遠端管理:命令行就是比較快! 此外,Linux 的管理常常需要通過遠端連線,而連線時命令行的傳輸速度一定比較快, 而且,較不容易出現斷線或者是信息外流的問題,因此,shell 真的是得學習的一項工具。而且,他可以讓您更深入 Linux ,更了解他,而不是只會按一按鼠標而已!所謂“天助自助者!”多摸一點文字模式的東西,會讓你與 Linux 更親近呢! * Linux 的任督二脈: shell 是也! 有些朋友也很可愛,常會說:“我學這么多干什么? 又不常用,也用不到!”嘿嘿!有沒有聽過“書到用時方恨少?” 當你的主機一切安然無恙的時候,您當然會覺得好像學這么多的東西一點幫助也沒有呀! 萬一,某一天真的不幸給他中標了,您該如何是好?是直接重新安裝? 還是先追蹤入侵來源后進行漏洞的修補?或者是干脆就關站好了?這當然涉及很多的考慮, 但就以鳥哥的觀點來看,多學一點總是好的,尤其我們可以有備而無患嘛!甚至學的不精也沒有關系,了解概念也就 OK 啦!畢竟沒有人要您一定要背這么多的內容啦!了解概念就很了不起了! 此外,如果你真的有心想要將您的主機管理的好,那么良好的 shell 程序編寫是一定需要的啦!就鳥哥自己來說,鳥哥管理的主機雖然還不算多, 只有區區不到十部,但是如果每部主機都要花上幾十分鐘來查閱他的登錄文件信息以及相關的訊息, 那么鳥哥可能會瘋掉!基本上,也太沒有效率了!這個時候,如果能夠借由 shell 提供的數據流重導向以及管線命令,呵呵! 那么鳥哥分析登錄信息只要花費不到十分鐘就可以看完所有的主機之重要信息了!相當的好用呢! 由于學習 shell 的好處真的是多多啦!所以,如果你是個系統管理員,或者有心想要管理系統的話,那么 shell 與 shell scripts 這個東西真的有必要看一看!因為他就像“打通任督二脈,任何武功都能隨你應用”的說! ### 10.1.3 系統的合法 shell 與 /etc/shells 功能 知道什么是 Shell 之后,那么我們來了解一下 Linux 使用的是哪一個 shell 呢?什么!哪一個?難道說 shell 不就是“一個 shell 嗎?”哈哈!那可不!由于早年的 Unix 年代,發展者眾,所以由于 shell 依據發展者的不同就有許多的版本,例如常聽到的 Bourne SHell (sh) 、在 Sun 里頭默認的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點。至于 Linux 使用的這一種版本就稱為“ Bourne Again SHell (簡稱 bash) ”,這個 Shell 是 Bourne Shell 的增強版本,也是基準于 GNU 的架構下發展出來的呦! 在介紹 shell 的優點之前,先來說一說 shell 的簡單歷史吧[[2]](#ps2):第一個流行的 shell 是由 Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell ,或直接簡稱為 sh !而后來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附于 BSD 版的 Unix 系統中的 shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh !由于在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一 。 ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 由于 Linux 為 C 程序語言撰寫的,很多程序設計師使用 C 來開發軟件,因此 C shell 相對的就很熱門了。 另外,還記得我們在[第一章、Linux 是什么](../Text/index.html)提到的吧? Sun 公司的創始人就是 Bill Joy,而 BSD 最早就是 Bill Joy 發展出來的啊。 那么目前我們的 Linux (以 CentOS 7.x 為例) 有多少我們可以使用的 shells 呢? 你可以檢查一下 /etc/shells 這個文件,至少就有下面這幾個可以用的 shells (鳥哥省略了重復的 shell 了!包括 /bin/sh 等于 /usr/bin/sh 啰!): * /bin/sh (已經被 /bin/bash 所取代) * /bin/bash (就是 Linux 默認的 shell) * /bin/tcsh (整合 C Shell ,提供更多的功能) * /bin/csh (已經被 /bin/tcsh 所取代) 雖然各家 shell 的功能都差不多,但是在某些語法的下達方面則有所不同,因此建議你還是得要選擇某一種 shell 來熟悉一下較佳。 Linux 默認就是使用 bash ,所以最初你只要學會 bash 就非常了不起了! ^_^! 另外,咦!為什么我們系統上合法的 shell 要寫入 /etc/shells 這個文件啊? 這是因為系統某些服務在運行過程中,會去檢查使用者能夠使用的 shells ,而這些 shell 的查詢就是借由 /etc/shells 這個文件啰! 舉例來說,某些 FTP 網站會去檢查使用者的可用 shell ,而如果你不想要讓這些使用者使用 FTP 以外的主機資源時,可能會給予該使用者一些怪怪的 shell,讓使用者無法以其他服務登陸主機。 這個時候,你就得將那些怪怪的 shell 寫到 /etc/shells 當中了。舉例來說,我們的 CentOS 7.x 的 /etc/shells 里頭就有個 /sbin/nologin 文件的存在,這個就是我們說的怪怪的 shell 啰~ 那么,再想一想,我這個使用者什么時候可以取得 shell 來工作呢?還有, 我這個使用者默認會取得哪一個 shell 啊?還記得我們在[第四章的在終端接口登陸linux小節](../Text/index.html#start_cmd)當中提到的登陸動作吧? 當我登陸的時候,系統就會給我一個 shell 讓我來工作了。 而這個登陸取得的 shell 就記錄在 /etc/passwd 這個文件內!這個文件的內容是啥? ``` [dmtsai@study ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(下面省略)..... ``` 如上所示,在每一行的最后一個數據,就是你登陸后可以取得的默認的 shell 啦!那你也會看到, root 是 /bin/bash ,不過,系統帳號 bin 與 daemon 等等,就使用那個怪怪的 /sbin/nologin 啰~關于使用者這部分的內容,我們留在[第十三章的帳號管理](../Text/index.html)時提供更多的說明。 ### 10.1.4 Bash shell 的功能 既然 /bin/bash 是 Linux 默認的 shell ,那么總是得了解一下這個玩意兒吧!bash 是 GNU 計劃中重要的工具軟件之一,目前也是 Linux distributions 的標準 shell 。 bash 主要相容于 sh ,并且依據一些使用者需求而加強的 shell 版本。不論你使用的是那個 distribution ,你都難逃需要學習 bash 的宿命啦!那么這個 shell 有什么好處,干嘛 Linux 要使用他作為默認的 shell 呢? bash 主要的優點有下面幾個: * 命令編修能力 (history): bash 的功能里頭,鳥哥個人認為相當棒的一個就是“他能記憶使用過的指令!” 這功能真的相當的棒!因為我只要在命令行按“上下鍵”就可以找到前/后一個輸入的指令!而在很多 distribution 里頭,默認的指令記憶功能可以到達 1000 個!也就是說,你曾經下達過的指令幾乎都被記錄下來了。 這么多的指令記錄在哪里呢?在你的主文件夾內的 .bash_history 啦! 不過,需要留意的是,~/.bash_history 記錄的是前一次登陸以前所執行過的指令, 而至于這一次登陸所執行的指令都被暫存在內存中,當你成功的登出系統后,該指令記憶才會記錄到 .bash_history 當中! 這有什么優點呢?最大的好處就是可以“查詢曾經做過的舉動!” 如此可以知道你的執行步驟,那么就可以追蹤你曾下達過的指令,以作為除錯的重要流程! 但如此一來也有個煩惱,就是如果被駭客入侵了,那么他只要翻你曾經執行過的指令, 剛好你的指令又跟系統有關 (例如直接輸入 MySQL 的密碼在命令行上面),那你的服務器可就傷腦筋了! 到底記錄指令的數目越多還是越少越好?這部份是見仁見智啦,沒有一定的答案的。 * 命令與文件補全功能: ([tab] 按鍵的好處) 還記得我們在[第四章內的重要的幾個熱鍵小節](../Text/index.html#cmd_hkey)當中提到的 [tab] 這個按鍵嗎?這個按鍵的功能就是在 bash 里頭才有的啦!常常在 bash 環境中使用 [tab] 是個很棒的習慣喔!因為至少可以讓你 1)少打很多字; 2)確定輸入的數據是正確的! 使用 [tab] 按鍵的時機依據 [tab] 接在指令后或參數后而有所不同。我們再復習一次: * [Tab] 接在一串指令的第一個字的后面,則為命令補全; * [Tab] 接在一串指令的第二個字以后時,則為“文件補齊”! * 若安裝 bash-completion 軟件,則在某些指令后面使用 [tab] 按鍵時,可以進行“選項/參數的補齊”功能! 所以說,如果我想要知道我的環境當中所有以 c 為開頭的指令呢?就按下“ c[tab][tab] ”就好啦! ^_^! 是的!真的是很方便的功能,所以,有事沒事,在 bash shell 下面,多按幾次 [tab] 是一個不錯的習慣啦! * 命令別名設置功能: (alias) 假如我需要知道這個目錄下面的所有文件 (包含隱藏文件) 及所有的文件屬性,那么我就必須要下達“ ls -al ”這樣的指令串,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如鳥哥最喜歡直接以 lm 這個自訂的命令來取代上面的命令,也就是說, lm 會等于 ls -al 這樣的一個功能,嘿!那么要如何作呢?就使用 alias 即可!你可以在命令行輸入 alias 就可以知道目前的命令別名有哪些了!也可以直接下達命令來設置別名呦: * alias lm='ls -al' * 工作控制、前景背景控制: (job control, foreground, background) 這部分我們在[第十六章 Linux 程序控制](../Text/index.html)中再提及! 使用前、背景的控制可以讓工作進行的更為順利!至于工作控制(jobs)的用途則更廣, 可以讓我們隨時將工作丟到背景中執行!而不怕不小心使用了 [Ctrl] + c 來停掉該程序!真是好樣的!此外,也可以在單一登陸的環境中,達到多任務的目的呢! * 程序化腳本: (shell scripts) 在 DOS 年代還記得將一堆指令寫在一起的所謂的“批處理文件”吧?在 Linux 下面的 shell scripts 則發揮更為強大的功能,可以將你平時管理系統常需要下達的連續指令寫成一個文件, 該文件并且可以通過對談互動式的方式來進行主機的偵測工作!也可以借由 shell 提供的環境變量及相關指令來進行設計,哇!整個設計下來幾乎就是一個小型的程序語言了!該 scripts 的功能真的是超乎鳥哥的想像之外!以前在 DOS 下面需要程序語言才能寫的東西,在 Linux 下面使用簡單的 shell scripts 就可以幫你達成了!真的厲害!這部分我們在[第十二章](../Text/index.html)再來談! * 萬用字符: (Wildcard) 除了完整的字串之外, bash 還支持許多的萬用字符來幫助使用者查詢與指令下達。 舉例來說,想要知道 /usr/bin 下面有多少以 X 為開頭的文件嗎?使用:“ ls -l /usr/bin/X* ”就能夠知道啰~此外,還有其他可供利用的萬用字符, 這些都能夠加快使用者的操作呢! 總之,bash 這么好!不學嗎?怎么可能!來學吧! ^_^ ### 10.1.5 查詢指令是否為 Bash shell 的內置命令: type 我們在[第四章](../Text/index.html)提到關于 [Linux 的線上說明文檔](../Text/index.html#manual_man)部分,也就是 man page 的內容,那么 bash 有沒有什么說明文檔啊?開玩笑~ 這么棒的東西怎么可能沒有說明文檔!請你在 shell 的環境下,直接輸入 man bash 瞧一瞧, 嘿嘿!不是蓋的吧!讓你看個幾天幾夜也無法看完的 bash 說明文檔,可是很詳盡的數據啊! ^_^ 不過,在這個 bash 的 man page 當中,不知道你是否有察覺到,咦! 怎么這個說明文檔里面有其他的文件說明啊?舉例來說,那個 cd 指令的說明就在這個 man page 內? 然后我直接輸入 man cd 時,怎么出現的畫面中,最上方竟然出現一堆指令的介紹?這是怎么回事? 為了方便 shell 的操作,其實 bash 已經“內置”了很多指令了,例如上面提到的 cd , 還有例如 umask 等等的指令,都是內置在 bash 當中的呢! 那我怎么知道這個指令是來自于外部指令(指的是其他非 bash 所提供的指令) 或是內置在 bash 當中的呢? 嘿嘿!利用 type 這個指令來觀察即可!舉例來說: ``` [dmtsai@study ~]$ type [-tpa] name 選項與參數: :不加任何選項與參數時,type 會顯示出 name 是外部指令還是 bash 內置指令 -t :當加入 -t 參數時,type 會將 name 以下面這些字眼顯示出他的意義: file :表示為外部指令; alias :表示該指令為命令別名所設置的名稱; builtin :表示該指令為 bash 內置的指令功能; -p :如果后面接的 name 為外部指令時,才會顯示完整文件名; -a :會由 PATH 變量定義的路徑中,將所有含 name 的指令都列出來,包含 alias 范例一:查詢一下 ls 這個指令是否為 bash 內置? [dmtsai@study ~]$ type ls ls is aliased to `ls --color=auto' &lt;==未加任何參數,列出 ls 的最主要使用情況 [dmtsai@study ~]$ type -t ls alias &lt;==僅列出 ls 執行時的依據 [dmtsai@study ~]$ type -a ls ls is aliased to `ls --color=auto' &lt;==最先使用 aliase ls is /usr/bin/ls &lt;==還有找到外部指令在 /bin/ls 范例二:那么 cd 呢? [dmtsai@study ~]$ type cd cd is a shell builtin &lt;==看到了嗎? cd 是 shell 內置指令 ``` 通過 type 這個指令我們可以知道每個指令是否為 bash 的內置指令。 此外,由于利用 type 搜尋后面的名稱時,如果后面接的名稱并不能以可執行文件的狀態被找到, 那么該名稱是不會被顯示出來的。也就是說, type 主要在找出“可執行文件”而不是一般文件文件名喔! 呵呵!所以,這個 type 也可以用來作為類似 [which](../Text/index.html#which) 指令的用途啦!找指令用的! ### 10.1.6 指令的下達與快速編輯按鈕 我們在[第四章的開始下達指令小節](../Text/index.html#cmd_cmd)已經提到過在 shell 環境下的指令下達方法,如果你忘記了請回到第四章再去回憶一下!這里不重復說明了。 鳥哥這里僅就反斜線 (\) 來說明一下指令下達的方式啰! ``` 范例:如果指令串太長的話,如何使用兩行來輸出? [dmtsai@study ~]$ cp /var/spool/mail/root /etc/crontab \ &gt; /etc/fstab /root ``` 上面這個指令用途是將三個文件復制到 /root 這個目錄下而已。不過,因為指令太長, 于是鳥哥就利用“ \[Enter] ”來將 [Enter] 這個按鍵“跳脫!”開來,讓 [Enter] 按鍵不再具有“開始執行”的功能!好讓指令可以繼續在下一行輸入。 需要特別留意, [Enter] 按鍵是緊接著反斜線 (\) 的,兩者中間沒有其他字符。 因為 \ 僅跳脫“緊接著的下一個字符”而已!所以,萬一我寫成: “ \ [Enter] ”,亦即 [Enter] 與反斜線中間有一個空格時,則 \ 跳脫的是“空白鍵”而不是 [Enter] 按鍵!這個地方請再仔細的看一遍!很重要! 如果順利跳脫 [Enter] 后,下一行最前面就會主動出現 &gt; 的符號, 你可以繼續輸入指令啰!也就是說,那個 &gt; 是系統自動出現的,你不需要輸入。 另外,當你所需要下達的指令特別長,或者是你輸入了一串錯誤的指令時,你想要快速的將這串指令整個刪除掉,一般來說,我們都是按下刪除鍵的。 有沒有其他的快速組合鍵可以協助呢?是有的!常見的有下面這些: | 組合鍵 | 功能與示范 | | --- | --- | --- | | [ctrl]+u/[ctrl]+k | 分別是從光標處向前刪除指令串 ([ctrl]+u) 及向后刪除指令串 ([ctrl]+k)。 | | [ctrl]+a/[ctrl]+e | 分別是讓光標移動到整個指令串的最前面 ([ctrl]+a) 或最后面 ([ctrl]+e)。 | 總之,當我們順利的在終端機 (tty) 上面登陸后, Linux 就會依據 /etc/passwd 文件的設置給我們一個 shell (默認是 bash),然后我們就可以依據上面的指令下達方式來操作 shell, 之后,我們就可以通過 man 這個線上查詢來查詢指令的使用方式與參數說明, 很不錯吧!那么我們就趕緊更進一步來操作 bash 這個好玩的東西啰!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看