shell和shell腳本


1、什么是shell和shell腳本

  Shell 本身是一個用 C 語言編寫的程序,是一個命令行解釋器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統,它是用戶使用 Linux 的橋梁,是UNIX/Linux系統的用戶與操作系統之間的一種接口。

  Shell既是一種命令語言,又是一種程序設計語言(shell腳本)。它雖然不是 Linux系統內核的一部分,但它調用了系統內核的大部分功能來執行程序、創建文檔並以並行的方式協調各個程序的運行。

  它既是終端上的用戶與UNIX/Linux操作系統交互的命令解釋程序(shell命令),又是一種高級的命令程序設計語言(shell腳本)。

   作為命令解釋程序,shell接收用戶輸入的 命令語言,將命令翻譯成一個動作序列,然后調用系統過程執行這條命令。

  作為命令程序設計語言,shell具有一般高級語言的許多特征,如變量定義、賦值、條件和循環語句等。用戶可以利用SHELL的這些功能將多條命令組織成一個命令程序,以完成某種特定的任務。這個命令程序稱為shell程序或shell過程。

  由於安全、復雜、繁瑣等原因,用戶不能直接接觸內核(也沒有必要),需要另外再開發一個程序,讓用戶直接使用這個程序;該程序的作用就是接收用戶的操作(點擊圖標、輸入命令),並進行簡單的處理,然后再傳遞給內核,這樣用戶就能間接地使用操作系統內核了。你看,在用戶和內核之間增加一層“代理”,既能簡化用戶的操作,又能保障內核的安全,何樂不為呢?

  用戶界面和命令行就是這個另外開發的程序,就是這層“代理”。在Linux下,這個命令行程序叫做shell

  Shell 是一個應用程序,它連接了用戶和 Linux 內核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質。

  Shell 本身並不是內核的一部分,它只是站在內核的基礎上編寫的一個應用程序,它和 QQ、迅雷、Firefox 等其它軟件沒有什么區別。然而 Shell 也有着它的特殊性,就是開機立馬啟動,並呈現在用戶面前;用戶通過 Shell 來使用 Linux,不啟動 Shell 的話,用戶就沒辦法使用 Linux。

2、shelle命令與圖形界面的區別

  對於圖形界面,用戶點擊某個圖標就能啟動某個程序;對於命令行,用戶輸入某個程序的名字(可以看做一個命令)就能啟動某個程序。這兩者的基本過程都是類似的,都需要查找程序在硬盤上的安裝位置,然后將它們加載到內存運行。

  換句話說,圖形界面和命令行要達到的目的是一樣的,都是讓用戶控制計算機。

  真正能夠控制計算機硬件(CPU、內存、顯示器等)的只有操作系統內核(Kernel),圖形界面和命令行只是架設在用戶和內核之間的一座橋梁。

3、Shell是如何連接用戶和內核的

  Shell 程序本身的功能是很弱的,比如文件操作、輸入輸出、進程管理等都得依賴內核。我們運行一個命令,大部分情況下 Shell 都會去調用內核暴露出來的接口,這就是在使用內核,只是這個過程被 Shell 隱藏了起來,它自己在背后默默進行,我們看不到而已。而接口其實就是一個一個的函數,使用內核就是調用這些函數。這就是使用內核的全部內容了嗎?嗯,是的!除了函數,你沒有別的途徑使用內核。

  比如,我們都知道在 Shell 中輸入cat test.txt命令就可以查看 test.txt 文件中的內容,然而,test.txt 放在磁盤的哪個位置?分成了幾個數據塊?在哪里開始?在哪里終止?如何操作探頭讀取它?這些底層細節 Shell 統統不知道的,它只能去調用內核提供的 open() 和 read() 函數,告訴內核我要讀取 log.txt 文件,請幫助我,然后內核就乖乖地按照 Shell 的吩咐去讀取文件了,並將讀取到的文件內容交給 Shell,最后再由 Shell 呈現給用戶(其實呈現到顯示器上還得依賴內核)。整個過程中 Shell 就是一個“中間商”,它在用戶和內核之間“倒賣”數據,只是用戶不知道罷了。

4、shell的分類
  Shell 是一個程序,一般都是放在/bin或者/usr/bin目錄下(如下圖中的bash),當前 Linux 系統可用的 Shell 都記錄在/etc/shells文件中。/etc/shells是一個純文本文件,你可以在圖形界面下打開它,也可以使用 cat 命令查看它。

  通過 cat 命令來查看當前 Linux 系統的可用 Shell:

  在現代的 Linux 上,sh 已經被 bash 代替,/bin/sh往往是指向/bin/bash的符號鏈接。

  如果你希望查看當前 Linux 的默認 Shell,那么可以輸出 SHELL 環境變量:

   輸出結果表明默認的 Shell 是 bash。

  echo是一個 Shell 命令,用來輸出變量的值。SHELL是 Linux 系統中的環境變量,它指明了當前使用的 Shell 程序的位置,也就是使用的哪個 Shell。 

  不同的shell具備不同的功能,shell還決定了Linux中默認的shell是/bin/bash,流行的shell有sh、ash、bash、csh、tcsh、ksh、zsh等,不同的shell都有自己的特點以及用途。

  (1)sh

  sh 的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發,為了紀念他,就用他的名字命名了。

  sh 是 UNIX 上的標准 shell,很多 UNIX 版本都配有 sh。sh 是第一個流行的 Shell。

  (2)csh

  sh 之后另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。

  Bill Joy 是一個風雲人物,他創立了 BSD 操作系統,開發了 vi 編輯器,還是 Sun 公司的創始人之一。

  BSD 是 UNIX 的一個重要分支,后人在此基礎上發展出了很多現代的操作系統,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就連 Mac OS X 在很大程度上也基於BSD。

  (3)tcsh

  tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支持。

  (4)ash

  一個簡單的輕量級的 Shell,占用資源少,適合運行於低內存環境,但是與下面講到的 bash shell 完全兼容。

  (5)bash

  bash shell 是 Linux 的默認 shell,本教程也基於 bash 編寫。bash 由 GNU 組織開發,保持了對 sh shell 的兼容性,是各種 Linux 發行版默認配置的 shell。bash 兼容 sh 意味着,針對 sh 編寫的 Shell 代碼可以不加修改地在 bash 中運行。

  盡管如此,bash 和 sh 還是有一些不同之處:一方面,bash 擴展了一些命令和參數;另一方面,bash 並不完全和 sh 兼容,它們有些行為並不一致,但在大多數企業運維的情況下區別不大,特殊場景可以使用 bash 代替 sh。

5、進入shell的兩種方式

  在 Linux 發展的早期,唯一能用的工具就是 Shell,Linux 用戶都是在 Shell 中輸入文本命令,並查看文本輸出;如果有必要的話,Shell 也能顯示一些基本的圖形。而如今 Linux 的環境已經完全不同,幾乎所有的 Linux 發行版都使用某種圖形桌面環境(例如 GNOME、KDE、Unity 等),這使得原生的 Shell 入口被隱藏了,進入 Shell 仿佛變得困難起來。

  (1)進入 Linux 控制台

  一種進入 Shell 的方法是讓 Linux 系統退出圖形界面模式,進入控制台模式,這樣一來,顯示器上只有一個簡單的帶着白色文字的“黑屏”,就像圖形界面出現之前的樣子。這種模式稱為 Linux 控制台(Console)。

  現代 Linux 系統在啟動時會自動創建幾個虛擬控制台(Virtual Console),其中一個供圖形桌面程序使用,其他的保留原生控制台的樣子。虛擬控制台其實就是 Linux 系統內存中運行的虛擬終端(Virtual Terminal)。

  從圖形界面模式進入控制台模式也很簡單,往往按下Ctrl + Alt + Fn(n=1,2,3,4,5...)快捷鍵就能夠來回切換。

  uabntu在啟動時會創建7個虛擬控制台,按下crtl+alt+fn(n=1~7)可以來回切換,1~6為控制台模式,,7為圖形界面模式。

  centos在啟動時會創建6個虛擬控制台,按下crtl+alt+fn(n=1~6)可以來回切換,2~6為控制台模式,1為圖形界面模式。

  下圖就是進入了控制台模式:

  輸入用戶名和密碼,登錄成功后就可以進入 Shell 了。$是命令提示符,我們可以在它后面輸入 Shell 命令。

  圖形界面也是一個程序,會占用 CPU 時間和內存空間,當 Linux 作為服務器系統時,安裝調試完畢后,應該讓 Linux 運行在控制台模式下,以節省服務器資源。正是由於這個原因,很多服務器甚至不安裝圖形界面程序,管理員只能使用命令來完成各項操作。  

  (2)使用終端

  進入 Shell 的另外一種方法是使用linux桌面環境中的終端模擬包(Terminal emulation package),也就是我們常說的終端(Terminal),這樣在圖形桌面中就可以使用 Shell。

  命令提示符的格式不是固定的,用戶可以根據自己的喜好來修改,Shell 通過PS1和PS2這兩個環境變量來控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。

  PS1 控制最外層的命令提示符格式,PS2 控制第二層的命令提示符格式。

  在修改 PS1 和 PS2 之前,我們先用 echo 命令輸出它們的值,看看默認情況下是什么樣子的:

  Linux 使用以\為前導的特殊字符來表示命令提示符中包含的要素,這使得 PS1 和 PS2 的格式看起來可能有點奇怪。下表展示了可以在 PS1 和 PS2 中使用的特殊字符。

  如果命令在第一行沒有輸入完,按回車鍵時會顯示命令提示符“<”,表示命令沒有輸入完,繼續輸入

6、shell命令

  在 Shell 中輸入的命令,有一部分是 Shell 本身自帶的,這叫做內置命令;有一部分是其它的應用程序(一個程序就是一個命令),這叫做外部命令

  Shell 本身支持的命令並不多,功能也有限,但是 Shell 可以調用其他的程序,每個程序就是一個命令,這使得 Shell 命令的數量可以無限擴展,其結果就是 Shell 的功能非常強大,完全能夠勝任 Linux 的日常管理工作,如文本或字符串檢索、文件的查找或創建、大規模軟件的自動部署、更改系統設置、監控服務器性能、發送報警郵件、抓取網頁內容、壓縮文件等。

   更加驚訝的是,Shell 還可以讓多個外部程序發生連接,在它們之間很方便地傳遞數據,也就是把一個程序的輸出結果傳遞給另一個程序作為輸入。

   大家所說的 Shell 強大,並不是 Shell 本身功能豐富,而是它擅長使用和組織其他的程序。Shell 就是一個領導者,這正是 Shell 的魅力所在。

   可以將 Shell 在整個 Linux 系統中的地位描述成下圖所示的樣子。注意“用戶”和“其它應用程序”是通過虛線連接的,因為用戶啟動 Linux 后直接面對的是 Shell,通過 Shell 才能運行其它的應用程序。


  (1)Shell 命令分為兩種

  Shell 自帶的命令稱為內置命令內置命令的本質是一個內部函數,執行內置命令就是調用這個自帶的函數。因為這些內置命令所對應的函數代碼在 Shell 啟動時已經被加載到內存了,所以內置命令的執行速度很快。

  Shell 外部命令的本質是一個應用程序,執行外部命令就是啟動一個新的應用程序。因為外部命令要創建新的進程並加載應用程序的代碼,所以外部命令的執行速度很慢。

  用戶輸入一個命令后,Shell 先檢測該命令是不是內置命令,如果是就執行,如果不是就檢測有沒有對應的外部程序:有的話就轉而執行外部程序,執行結束后再回到 Shell;沒有的話就報錯,告訴用戶該命令不存在。

  內置命令后面附帶的所有數據(所有選項和參數)最終都以參數的形式傳遞給了函數,外部命令后面附帶的所有數據(所有選項和參數)最終都以參數的形式傳遞給了應用程序。

  不管是內置命令還是外部命令,它后面附帶的數據最終都以參數的形式傳遞給了函數。實現一個命令的一項重要工作就是解析傳遞給函數的參數。

  shell是一個程序,/bin目錄下的bash就是ubantu下默認的shell,在終端上輸入命令(命令[選項][參數]),bash程序就會根據命令執行對應的函數,而編寫.sh文件就相當於將多個命令連續執行。

  A、內置命令(ls、cd等)-----對應bash程序內部的函數

    shell 命令的基本格式:command [選項] [參數]

    []表示可選的,也就是可有可無。有些命令不寫選項和參數也能執行,有些命令在必要的時候可以附帶選項和參數。

    有些命令有些時候可以不帶選項和參數,有些命令有些時候必須要帶選項和參數。

      ls -l:-l就表示ls命令的選項
      cd code:code就是cd命令的參數,表示進入code目錄
      echo -n "how are you":-n就是echo命令的選項,表示輸出字符串后不換行,“how are you”就表示參數

    內置命令后面的選項和參數都是以空格分開的,空格分開幾部分就表示幾個參數,命令不屬於參數,命令就相當於對應的函數,選項和參數就相當於函數中的參數。

    並且,命令后面附帶的數據都是“原汁原味”地傳遞給了函數,比如ls -l要傳遞的參數分別是 -l,減號-也會一起傳遞過去,在函數內部,減號-可以用來區分該參數是否是命令的選項。

    內置命令不宜過多,過多的內置命令會導致 Shell 程序本身體積膨脹,運行 Shell 程序后就會占用更多的內存。Shell 是一個常駐內存的程序,占用過多內存會影響其它的程序。

    只有那些最常用的命令才有理由成為內置命令,比如 cd、kill、echo 等;你可以轉到《Shell內置命令》來了解所有的內置命令,以及如何判斷一個命令是否是內置命令。

    常用的命令為使用shell界面開發用戶程序必須用到的命令,大致可以分成五大類:

     (1)文件管理類:cd,chmod,chown,chgrp,comm,cp,crypt,diff,file,find,In,ls,mkdir,mv,cd,pr,pwd,mv,mvdir。

     (2)進程管理類:at,kill,mail,nice,nohup,ps,time,write,mesg。

     (3)文本加工類:cat,crypt,grep,norff,unlq,WC、sort,spell,tail,troff。

     (4)軟件開發類:CC,f77,login,logout,size,yacc,vi,emacs,dbx、lex,make,lint,ld。

    (5)系統維護類。date,man,passwd,stty、tty,who等。

  B、外部命令(執行其它程序)------bash外部的程序

    外部命令可能是讀者比較疑惑的,一個外部的應用程序究竟是如何變成一個 Shell 命令的呢?

    應用程序就是一個文件,只不過這個文件是可以執行的。既然是文件,那么它就有一個名字,並且存放在文件系統中。

    用戶在 Shell 中輸入一個外部命令后,只是將可執行文件的名字告訴了 Shell,但是並沒有告訴 Shell 去哪里尋找這個文件。難道 Shell 要遍歷整個文件系統,查看每個目錄嗎?這顯然是不能實現的。

    為了解決這個問題,Shell 在啟動文件中增加了一個叫做 PATH 的環境變量,該變量就保存了 Shell 對外部命令的查找路徑,如果在這些路徑下找不到同名的文件,Shell 也不會再去其它路徑下查找了,它就直接報錯。

  我們使用 echo 命令輸出 PATH 變量的值,看看它保存了哪些檢索路徑:

  不同的路徑之間以:分隔。根據上圖可知,Shell 只會在幾個固定的路徑中查找外部命令。

7、shell過程

   一個shell過程是由能執行一個特定任務的一條或多條命令組成的。shell過程本身就是一個文件,通過系統中的編輯工具(如vi等)產生。與其他文件不同的是,它不需要編譯就可以執行。

   shell過程在調用時可以帶參數,這種參數稱為命令行參數,它們與shell過程中的位置參數($1,$2,…,$9)相對應。如:shcmd X Y Z

   則shell過程shcmd中的位置參數$1對應命令行參數“X”,$2對應“Y”,$3 對應“Z”。

8、Shell腳本語言

   Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。業界所說的 shell 通常都是指 shell 腳本,但是要知道,shell 和 shell script 是兩個不同的概念。"shell編程" 都是指 shell 腳本編程,不是指開發 shell 自身。

  有的編程語言,如 C/C++、Pascal、Go語言、匯編等,必須在程序運行之前將所有代碼都翻譯成二進制形式,也就是生成可執行文件,用戶拿到的是最終生成的可執行文件,看不到源碼。這個過程叫做編譯(Compile),這樣的編程語言叫做編譯型語言,完成編譯過程的軟件叫做編譯器(Compiler)

  而有的編程語言,如 Shell、JavaScript、Python、PHP等,需要一邊執行一邊翻譯,不會生成任何可執行文件,用戶必須拿到源碼才能運行程序。程序運行后會即時翻譯,翻譯完一部分執行一部分,不用等到所有代碼都翻譯完。這個過程叫做解釋,這樣的編程語言叫做解釋型語言或者腳本語言(Script),完成解釋過程的軟件叫做解釋器

  編譯型語言的優點是執行速度快、對硬件要求低、保密性好,適合開發操作系統、大型應用程序、數據庫等。腳本語言的優點是使用靈活、部署容易、跨平台性好,非常適合 Web 開發以及小工具的制作。

  Shell 編程語言就是一種腳本語言,我們編寫完源碼后不用編譯,直接運行源碼即可。

9、shell變量

   Shell提供了四類字符串變量,它們是:

   (1)位置變量

   如$0,$1,…,$9等,其中$0為shell過程名,$1到$9分別為過程名后的參數。

   (2)用戶定義的變量

   變量名由字母、數字等組成,變量的值為字符串。變量通過賦值語句進行定義。在SHELL過程中,通過“$變量名”的方式來引用變量的值。

   (3)專用變量

   這些變量對於SHELL具有特殊的含義。如變量HOME被初始化為用戶的登錄目錄,PATH為shell查找命令時所使用的查找路徑等。這些變量的值可以直接在shell過程中引用,也可以由用戶重新定義。

   (4)預定義變量

   這些變量具有特殊的含義,用戶在程序中只能引用,而不能對它們進行修改。如$#記錄傳送給shell過程的參數個數,它不包括$0

10、Shell腳本編程

  Shell 雖然沒有 C++、Java、Python 等強大,但也支持了基本的編程元素,例如:

     if...else 選擇結構,case...in 開關語句,for、while、until 循環;
    變量、數組、字符串、注釋、加減乘除、邏輯運算等概念;
    函數,包括用戶自定義的函數和內置函數(例如 printf、export、eval 等)。

  站在這個角度講,Shell 也是一種編程語言,它的編譯器(解釋器)是 Shell 這個程序。我們平時所說的 Shell,有時候是指連接用戶和內核的這個程序,有時候又是指 Shell 編程。

  Shell 主要用來開發一些實用的、自動化的小工具,而不是用來開發具有復雜業務邏輯的中大型軟件,例如檢測計算機的硬件參數、搭建 Web 運行環境、日志分析等,Shell 都非常合適。

  使用 Shell的熟練程度反映了用戶對 Linux 的掌握程度,運維工程師、網絡管理員、程序員都應該學習 Shell。

  尤其是 Linux 運維工程師,Shell 更是必不可少的,是必須掌握的技能,它使得我們能夠自動化地管理服務器集群,否則你就得一個一個地登錄所有的服務器,對每一台服務器都進行相同的設置,而這些服務器可能有成百上千之多,會浪費大量的時間在重復性的工作上。

  使用vim編輯器打開后綴名為.sh的文件,.sh表示shell腳本文件,如下圖所示:

   #!是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種 Shell;后面的/bin/bash就是指明了解釋器的具體位置。

  Shell 腳本中所有以#開頭的都是注釋(當然以#!開頭的除外)。

  在新進程中運行 Shell 腳本有多種方法:

  (1)將 Shell 腳本作為程序運行

  Shell 腳本也是一種解釋執行的程序,可以在終端直接調用(需要使用 chmod 命令給 Shell 腳本加上執行權限),如下所示:

  chmod +x表示給 test.sh 增加執行權限。./表示當前目錄,整條命令的意思是執行當前目錄下的 test.sh 腳本。如果不寫./,Linux 會到系統路徑(由 PATH 環境變量指定)下查找 test1.sh,而系統路徑下顯然不存在這個腳本,所以會執行失敗。

  通過這種方式運行腳本,腳本文件第一行的#!/bin/bash一定要寫對,好讓系統查找到正確的解釋器。

  (2)將 Shell 腳本作為參數傳遞給 Bash 解釋器

  直接運行 Bash 解釋器,將腳本文件的名字作為參數傳遞給 Bash,通過這種方式運行腳本,不需要在腳本文件的第一行指定解釋器信息,寫了也沒用。如下所示:


  更加簡潔的寫法是運行 bash 命令。bash 是一個外部命令,Shell 會在 /bin 目錄中找到對應的應用程序,也即 /bin/bash。如下圖所示:


  這兩種寫法在本質上是一樣的:第一種寫法給出了絕對路徑,會直接運行 Bash 解釋器;第二種寫法通過 bash 命令找到 Bash 解釋器所在的目錄,然后再運行,只不過多了一個查找的過程而已。

  在當前進程中運行shell:

  這里需要引入一個新的命令——source 命令。source 是 Shell 內置命令的一種,它會讀取腳本文件中的代碼,並依次執行所有語句。你也可以理解為,source 命令會強制執行腳本文件中的全部命令,而忽略腳本文件的權限。
  source 命令的用法為:source filename

  也可以簡寫為:. filename(注意:點后面有空格)

  兩種寫法的效果相同。使用 source 命令不用給腳本增加執行權限,並且寫不寫./都行,對於第二種寫法,注意點號.和文件名中間有一個空格。

11、shell的四種運行方式(啟動方式)

  Shell 是一個應用程序,它的一端連接着 Linux 內核,另一端連接着用戶。Shell 是用戶和 Linux 系統溝通的橋梁,我們都是通過 Shell 來管理 Linux 系統。

  我們可以直接使用 Shell,也可以輸入用戶名和密碼后再使用 Shell;第一種叫做非登錄式,第二種叫做登錄式。

  我們可以在 Shell 中一個個地輸入命令並及時查看它們的輸出結果,整個過程都在跟 Shell 不停地互動,這叫做交互式。我們也可以運行一個 Shell 腳本文件,讓所有命令批量化、一次性地執行,這叫做非交互式。
  總起來說,Shell 一共有四種運行方式:交互式的登錄 Shell;交互式的非登錄 Shell;非交互式的登錄 Shell;非交互式的非登錄 Shell。

  判斷shell是否為交互式有兩種方法:

  (1)查看變量-的值,如果值中包含了字母i,則表示交互式(interactive)。

  (2) 查看變量PS1的值,如果非空,則為交互式,否則為非交互式,因為非交互式會清空該變量。

  判斷 Shell 是否為登錄式:

  判斷 Shell 是否為登錄式也非常簡單,只需執行shopt login_shell即可,值為on表示為登錄式,off為非登錄式。

  shopt 命令用來查看或設置 Shell 中的行為選項,這些選項可以增強 Shell 的易用性。


  同時判斷交互式、登錄式:

  要同時判斷是否為交互式和登錄式,可以簡單使用如下的命令:echo $PS1; shopt login_shell或者echo $-; shopt login_shell

  常見的 Shell 啟動方式

  (1) 通過 Linux 控制台(不是桌面環境自帶的終端)或者 ssh 登錄 Shell 時(這才是正常登錄方式),為交互式的登錄 Shell。

  (2)執行 bash 命令時默認是非登錄的,增加--login選項(簡寫為-l)后變成登錄式。

 

  (3)使用由()包圍的組命令或者命令替換進入子 Shell 時,子 Shell 會繼承父 Shell 的交互和登錄屬性。

  (4) ssh 執行遠程命令,但不登錄時,為非交互非登錄式。
  $ ssh localhost 'echo $PS1;shopt login_shell'
  login_shell     off

  (5)在 Linux 桌面環境下打開終端時,為交互式的非登錄 Shell。

12、shell配置文件

  無論是否是交互式,是否是登錄式,Bash Shell 在啟動時總要配置其運行環境,例如初始化環境變量、設置命令提示符、指定系統命令路徑等。這個過程是通過加載一系列配置文件完成的,這些配置文件其實就是 Shell 腳本文件。

  與 Bash Shell 有關的配置文件主要有 /etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc、/etc/profile.d/*.sh,不同的啟動方式會加載不同的配置文件。

  ~表示用戶主目錄。*是通配符,/etc/profile.d/*.sh 表示 /etc/profile.d/ 目錄下所有的腳本文件(以.sh結尾的文件)。

  登錄式的 Shell

  Bash 官方文檔說:如果是登錄式的 Shell,首先會讀取和執行 /etc/profiles,這是所有用戶的全局配置文件,接着會到用戶主目錄中尋找 ~/.bash_profile、~/.bash_login 或者 ~/.profile,它們都是用戶個人的配置文件。

  不同的 Linux 發行版附帶的個人配置文件也不同,有的可能只有其中一個,有的可能三者都有。

  如果三個文件同時存在的話,到底應該加載哪一個呢?它們的優先級順序是 ~/.bash_profile > ~/.bash_login > ~/.profile。

  如果 ~/.bash_profile 存在,那么一切以該文件為准,並且到此結束,不再加載其它的配置文件。

  如果 ~/.bash_profile 不存在,那么嘗試加載 ~/.bash_login。~/.bash_login 存在的話就到此結束,不存在的話就加載 ~/.profile。

  注意,/etc/profiles 文件還會嵌套加載 /etc/profile.d/*.sh。
  同樣,~/.bash_profile 也使用類似的方式加載 ~/.bashrc。

  非登錄的 Shell

  如果以非登錄的方式啟動 Shell,那么就不會讀取以上所說的配置文件,而是直接讀取 ~/.bashrc。

  ~/.bashrc 文件還會嵌套加載 /etc/bashrc,請看下面的代碼.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM