成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入了解定制Bash

系統 Linux
操作系統的最外層 —— 也就是跟你直接打交道的 —— 叫做 shell(“外殼”)。Fedora 預裝了好幾種不同的 shell。shell 可以是圖形界面,或者字符界面。接下來在這篇文章中,我們會討論一些比較推薦的 Bash 字符界面的點文件配置。

[[334196]]

操作系統的最外層 —— 也就是跟你直接打交道的 —— 叫做 shell(“外殼”)。Fedora 預裝了好幾種不同的 shell。shell 可以是圖形界面,或者字符界面。在文檔中,你常常能見到兩個母縮寫詞 GUI (圖形用戶界面Graphical User Interface)跟 CLI(命令行界面Command-Line Interface),它們用來區分圖形和基于字符的 shell/界面。GNOME 和 Bash 分別是 Fedora 默認的圖形和命令行界面,不過你也可以使用其它 GUI 或者 CLI shell。

接下來在這篇文章中,我們會討論一些比較推薦的 Bash 字符界面的點文件配置。

Bash 概覽

Bash 參考手冊中寫道:

根本上來說,shell 只是一個能執行命令的宏處理器。宏處理器這個詞意味著通過擴展文本跟符號,從而構成更復雜的表達式。

Bash 參考手冊 第五版,Bash 5.0 2019 年 5 月

除了能使用其它程序之外,Bash shell 還含有一些內置命令和關鍵字。Bash 內置功能很強大,甚至能夠作為一門 高級語言 獨當一面。Bash 的幾個關鍵字和操作符類似于 C 語言

Bash 能夠以交互式或非交互式模式啟動。Bash 的交互模式是一個很多人都熟悉的典型的終端/命令行界面。GNOME 終端 默認以交互模式打開 Bash。Bash 在非交互模式下運行的例子是,當命令和數據從文件或 shell 腳本通過 管道 傳送到 Bash 時。其它 Bash 可以運行的模式包括:登錄login非登錄non-login遠程remote、POSIX、Unix sh、受限restricted,以及使用與用戶不同的 UID/GID 模式。各種模式是可以相互組合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登錄 + 遠程。不同的啟動模式,決定著 Bash 所讀取的啟動文件。理解這些操作模式,有助于幫助我們修改啟動文件。

根據 Bash 參考手冊,它會:

  1. 從文件中...、從作為 -c 調用選項傳入參數的字符...,或者從用戶的終端中讀取輸入。
  2. 將輸入分解成單詞和操作符,遵循 [它的] 引用規則。...這些標記使用元字符隔開。這一步執行別名展開。
  3. 將標記解析成簡單與復合命令。
  4. 執行各種 shell 展開...,將展開之后的標記分解成文件名...以及命令和參數的列表。
  5. 執行必要的重定向...并從參數列表中去除重定向操作符及其操作數。
  6. 執行命令。
  7. 必要時等待命令完成,并收集退出狀態。

Bash 參考文檔 第五版,Bash 版本 5.0 2019 年 5 月

當用戶開啟終端模擬器進入命令行環境時,便啟動了一次交互式 shell 會話。GNOME 終端默認以非登錄模式為用戶打開 Shell。你可以在 “編輯 → 首選項 → 配置文件 → 命令Edit → Preferences → Profilles → Command” 中配置 GNOME 終端以何種模式(登錄與非登錄式)啟動。也可以在 Bash 啟動時通過向其傳遞 -login 標志來要求進入登錄模式。要注意一點,Bash 的登錄模式與非交互模式并不互斥。可以讓 Bash 同時以登錄模式和非交互模式運行。

啟動 Bash

除非傳入 -noprofile 選項,否則登錄模式的 Bash shell 會默認讀取并執行某些初始化文件中命令。如果 /etc/profile 存在,它會是第一個被執行的文件,緊接著是按 ~/.bash_profile~/.bash_login 或 ~/.profile順序找到的第一個文件。當用戶退出登錄模式的 shell 時,或者有腳本在非交互式登錄模式的 shell 中調用了內置 exit命令,Bash 會讀取并執行 ~/.bash_logout 中的命令,如果 /etc/bash_logout 存在的話,會緊接著執行它。通常來說,/etc/profile 會援引source /etc/bashrc 文件,讀取并執行其中的命令,然后查找并讀取執行 /etc/profile.d 目錄中以 .sh 結尾的文件。同樣的,~/.bash_profile 通常也會援引source ~/.bashrc 文件。/etc/bashrc 和 ~/.bashrc 都會進行檢查,避免重復援引source

(LCTT 譯注:在 Bash 中,腳本會通過 source 或 . 命令來將另外一個腳本引入其中,這個行為稱之為 “source”、“sourcing”,但是該行為一直沒有公認且常用的翻譯方法。經過多番斟酌,我認為可以譯做“援引”,理由如下:1、“援引”具有“引用、引入”的意思,符合該行為;2、“援”這個詞的發音和“source” 常見的漢語意思“源”同音,便于記憶。以上是我們的愚見,供大家參考討論。—— 老王,2020/7/19)

一個交互式的 shell,如果不是登錄 shell,那么當它第一次被調用的時候,會執行 ~/.bashrc 文件。這是用戶在 Fedora 上打開終端時通常會進入的 shell 類型。當 Bash 以非交互模式啟動 —— 就像運行腳本時那樣 —— 它會尋找 BASH_ENV環境變量。如果找到了,就會展開它的值作為文件名,接著讀取并執行該文件。效果跟執行以下命令相同:

  1. if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

值得注意的是,不會使用 PATH 環境變量的值來搜索該文件名(LCTT 譯注:意即不會檢索搜索路徑)。

重要的用戶點文件

Bash 最廣為人知的用戶點文件是 ~/.bashrc。通過編輯該文件,可以設置大多數個性化選項。由于我們常常需要設置一些選項,會改動上面提及甚至沒有提及的文件,所以大部分自定義選項會成為一個麻煩事。Bash 環境具有很高的可定制性,正是為了適應不同用戶的不同需求。

 

當登錄 shell 正常退出時,如果 ~/.bash_logout 和 /etc/bash_logout 存在,它們會被調用。下一幅圖展示了 Bash 作為交互式 shell 啟動時的過程。例如,當用戶從桌面環境打開終端模擬器時,會按照以下順序進行。

 

我們已經知道,在不同的啟動模式下,Bash 會執行不同的命令,所以很明顯,只有幾種最需要關注的典型啟動模式。分別是非交互、交互式登錄 shell,和非交互式、交互式非登錄 shell。如果想定義某些全局環境,那么需要將一個具有唯一名稱、以 .sh 為后綴的文件(例如 custom.sh)放置在 /etc/profile.d 目錄。

對于非交互式非登錄啟動方式,需要特別注意。在這種模式下,Bash 會檢查 BASH_ENV 變量。如果定義了該變量,Bash 會援引它所指向的文件。另外,處理 BASH_ENV 時并不會使用 PATH 變量所存儲的值(LCTT 譯注:意即不會檢索搜索路徑),所以它必須包含執行文件的絕對路徑。比如說,如果有人希望非交互式執行腳本時,shell 能讀取 ~/.bashrc 文件中的設置,那么他可以把類似下面這樣的內容放在一個名為 /etc/profile.d/custom.sh 的文件中...

  1. # custom.sh
  2. .
  3. .
  4. .
  5. # 如果使用 Fedora Workstation
  6. BASH_ENV="/home/username/.bashrc"
  7. .
  8. .
  9. .
  10. # 如果使用 Fedora Silverblue Workstation
  11. BASH_ENV="/var/home/username/.bashrc"
  12.  
  13. export BASH_ENV

上面這份腳本會讓每個 shell 腳本在運行之前先執行該用戶的 ~/.bashrc

用戶一般都會自定義他們的系統環境,以便契合他們自己的工作習慣與偏好。舉例來說,用戶可以通過別名來實現這種程度的自定義。擁有相同起始參數、需要頻繁使用的命令是制作別名的最佳選擇。以下展示了一些來自 ~/.bashrc 文件中定義的別名。

  1. # .bashrc
  2. # 執行全局文件
  3. if [ -f /etc/bashrc ];
  4. then . /etc/bashrc
  5. fi
  6. .
  7. .
  8. .
  9. # 用戶別名和函數
  10. alias ls='ls -hF --color=auto'
  11. alias la='ls -ahF --color=auto'
  12.  
  13. # dir 命令用起來像在 Windows 那樣
  14. alias dir='ls --color=auto --format=long'
  15.  
  16. # 用顏色高亮 grep 結果
  17. alias grep='grep --color=auto'

在系統中,別名是一種自定義各種命令的方法。它能減少擊鍵次數,而且讓命令用起來更方便。針對用戶級別的別名通常存放在該用戶的 ~/.bashrc 文件中。

如果你發現自己經常要去歷史中查找曾經執行過的某條命令,那可能需要改改歷史設置了。你依然可以在 ~/.bashrc 文件中設置針對用戶級別的歷史選項。比如說,如習慣同時使用多個終端,那你可能要啟用 histappend 選項。某些 Bash 相關的 shell 選項本質上是布爾值(接收 on 或 off),通常可以用內置命令 shopt 啟用或禁用。接收更復雜的值的 Bash 選項(如 HISTTIMEFORMAT),常常通過賦值給環境變量來達到配置目的。以下演示如何以 shell 選項和環境變量定制 Bash。

  1. # 配置 Bash 歷史
  2.  
  3. # 用制表符擴展目錄環境變量,并設置 histappend
  4. shopt -s direxpand histappend
  5.  
  6. # ignoreboth 等同于 ignorespace ignoredup
  7. HISTCONTROL='ignoreboth'
  8.  
  9. # 控制 `history` 輸出中的時間格式
  10. HISTTIMEFORMAT="[%F %T] "
  11.  
  12. # 無限歷史記錄
  13. # NB:在新版 Bash 中,任何 < 0 的寫法都有效,但是在 CentOS/RHEL 中,只有這樣才行得通
  14. HISTSIZE=
  15. HISTFILESIZE=
  16.  
  17. # 或者對于使用新版 Bash 的人
  18. HISTSIZE=-1
  19. HISTFILESIZE=-1

上面例子中的 direxpand 選項,可以讓 Bash 在文件名補全時,用單詞展開結果替換目錄名。它會改變 readline 編輯緩沖區的內容,所以你所輸入的東西已經被補全得到的結果替換了。

HISTCONTROL 變量用于啟用或禁用命令歷史的某些過濾選項。重復行、以空白打頭的行,都能通過該選項將它們從命令歷史中過濾掉。引用自 Dusty Mabe,這是我從他那兒得到的技巧:

ignoredup 可以讓歷史不記錄重復條目(如果你反復執行同一條命令)。ignorespace 會忽略前面有空白的條目,當你在設置一個包含敏感信息的環境變量或者執行一條不想被記錄進磁盤的命令時,這就很有用。ignoreboth相當于這兩條選項的結合體。

Dusty Mabe – Redhat首席軟件工程師,2020.6.19

對于命令行重度用戶,Bash 有一個 CDPATH 環境變量。如果 CDPATH 包含一系列供 cd 命令搜索的目錄,且提供一個相對路徑作為第一個參數,那么它會按順序檢查所有列出的目錄,尋找匹配的子目錄并切換到第一個匹配結果目錄。

  1. # .bash_profile
  2.  
  3. # 設置 CDPATH
  4. CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
  5.  
  6. # 也可以寫成這樣
  7. CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
  8.  
  9. export CDPATH

CDPATH 通常像 PATH 一樣的方式進行更新 —— 通過在賦值右側引用自身來保留原來的值。

  1. # .bash_profile
  2.  
  3. # 設置 CDPATH
  4. CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
  5.  
  6. # 或者寫成這樣
  7. CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
  8.  
  9. CDPATH="$CDPATH:~/favdir4:~/favdir5"
  10.  
  11. export CDPATH

PATH 是另一個極其重要的變量。它是系統上的命令的搜索路徑。注意,有些應用要求將它們自己的目錄加入 PATH 變量,這樣才能正常使用。跟 CDPATH 一樣,通過在賦值右側引用原值來追加新值到 PATH 變量。如果你希望將新值前置,只需要把原來的值($PATH)放到列表末尾即可。還有注意的是在 Fedora,這一列值通過冒號分隔(:)。

  1. # .bash_profile
  2.  
  3. # 添加 PATH 值到 PAHT 環境變量
  4. PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"
  5.  
  6. export PATH

命令提示符是另一個流行的自定義選項。它有七個可定制的參數:

  • PROMPT_COMMAND:如果設置了,會在每一個主提示符($PS1)出現之前執行該值。
  • PROMPT_DIRTRIM:如果設置成大于零的數,則該值用作展開 \w 和 \W 提示符字符串轉義符時保留的尾隨目錄組件數量。刪除的字符將替換為省略號。
  • PS0:這個參數的值像 PS1 一樣展開,在交互式 shell 讀取命令之后、執行命令之前展示。
  • PS1:主提示符字符串。默認值是 \s-\v\$ 
  • PS2:次提示符字符串。默認是 。在顯示之前,PS2 像 PS1 那樣展開。
  • PS3:這個參數的值用作 select 命令的提示符。如果這個變量沒有設置,select 命令會用 #?  作為提示符。
  • PS4:這個參數的值像 PS1 那樣展開,如果設置了 -x 選項,這個展開值會在命令行被回顯之前作為提示符顯示。展開后的值的第一個字符在必要時會復制數次,指示間接層數。默認值是 

Bash 參考文檔 第五版,Bash 版本 5.0 2019 年 5 月

Bash 的這一個方面就可以用整篇文章來討論。你可以找到許許多多信息和例子。在本文末尾鏈接的存儲庫中提供了一些點文件范例,包括提示符重新配置。你可以隨意使用該存儲庫中的例子進行學習和體驗。

總結

既然你已經掌握了一些 Bash 的工作原理,那就可以輕松修改你的 Bash 點文件,滿足你自己的需求和習慣。美化你的提示符,制作一些別名,這樣你的電腦才真的屬于你。查看 /etc/profile/etc/bashrc 和 /etc/profile.d/ 這些文件的內容,獲得一些啟發。

你也可以在這里寫一些關于終端模擬器的評論。有很多辦法可以將你最喜歡的終端,完全配置成你想要的樣子。你或許早就想到了,但是通常可以通過……嗯……用戶家目錄的點文件實現這個目的。終端模擬器也可以作為登錄會話啟動,有些人總喜歡用登錄環境。你使用終端和電腦的姿勢,取決于你如何修改(或不修改)你的點文件。

如果你很好奇自己的命令行處于什么會話狀態,使用下面這個腳本來判斷一下。

  1. #!/bin/bash
  2.  
  3. case "$-" in
  4. (*i*) echo This shell is interactive ;;
  5. (*) echo This shell is not interactive ;;
  6. esac

把這幾行放到一個文件里,加上可執行權限,然后運行,就能看到你當前處于何種類型的 shell。$- 在 Bash 中是一個變量,如果是交互式 shell,它會包含字母 i。此外,你可以直接輸出 $- 變量然后檢查它的輸出中是否含有 i 標記。

  1. $ echo $-

參考信息

可以參考以下資料以獲取更多信息和示例。Bash 手冊也是一個很好的信息來源。請注意,確保你的本地手冊頁記錄了你當前運行的 Bash 版本的特性,因為在網上找到的信息有時可能太老(過時了)或太新(你的系統還沒有安裝)。

對本文有各種形式(點文件示例、提示,以及腳本文件)貢獻的社區成員:

  • Micah Abbott – 首席質量工程師
  • John Lebon – 首席軟件工程師
  • Dusty Mabe – 首席軟件工程師
  • Colin Walters – 高級首席軟件工程師

示例點文件和腳本可以在這個存儲庫中找到:

請仔細檢查上面所提供的存儲庫中的信息。有些可能已經過時了。里面還包含很多開發中的自定義腳本和寵物容器pet container配置例子,那些不是點文件。我推薦從 John Lebon 的點文件開始學習,從頭到尾都含有完善的解說,它們是我見過的最詳細的,并且包含了非常好的描述。祝你學得開心!

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-06-23 20:31:54

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-15 11:40:44

Oracle表空間

2018-06-22 13:05:02

前端JavaScript引擎

2021-01-19 12:00:39

前端監控代碼

2010-09-27 09:31:42

JVM內存結構

2021-04-28 10:13:58

zookeeperZNode核心原理

2010-11-08 13:54:49

Sqlserver運行

2013-04-16 10:20:21

云存儲服務云存儲SLA服務水平協議

2013-10-09 11:07:31

日志文件系統

2010-09-28 09:14:36

HTML DOMJavascript

2019-03-05 10:52:13

2009-09-24 16:22:50

Hibernate自動
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 69精品久久久久久 | 国产精品美女久久久免费 | 国产精品日日摸夜夜添夜夜av | 国产激情91久久精品导航 | 黄片毛片免费看 | 青青草精品视频 | 一级毛片高清 | 欧美一级二级三级视频 | 一区二区三区欧美 | 日韩精品成人在线 | 国产特级毛片aaaaaa喷潮 | 久久国产一区 | 久久久亚洲精品视频 | 综合久久综合久久 | 伊人超碰在线 | www.久草.com | 亚洲一区二区中文字幕 | 国产一区二区精品在线观看 | 自拍偷拍中文字幕 | 国产精品日本一区二区在线播放 | 黄免费看 | 欧美另类视频 | 亚洲免费成人 | 91在线观看免费视频 | 中文字幕在线视频免费观看 | 久久av影院 | 青青草网站在线观看 | www.五月天婷婷 | 自拍第1页 | 欧美xxxx在线 | 午夜久久av | 国产一级特黄真人毛片 | 国产精品欧美一区喷水 | 欧美一区二区三区四区五区无卡码 | 亚洲一区国产 | 久久综合久久自在自线精品自 | 97视频在线观看免费 | 亚洲欧美精 | 亚洲网站免费看 | 久久国产精品网站 | 日韩精品视频中文字幕 |