亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Mac OS > 正文

在Mac OS上使用Fish Shell的基礎教程

2020-10-18 13:13:53
字體:
來源:轉載
供稿:網友

英語是一種令人困惑的語言。例如,請考慮 moon 和 good 這兩個單詞。對外行人而言,這兩個單詞似乎應該是押韻的,但是前者的讀音是 /mun/(根據 International Pronunciation Alphabet),而后者的讀音是 /good/。似乎英語中的惟一規則就是例外。
UNIX shell 同樣令人困惑。例如,在 Bourne shell(和大多數常用的 UNIX shell)中,'$var'、"$var" 和 `$var` 看起來相似,但是它們會產生很不一樣的結果。(在本文中的 shell 示例中,每個 CLI 前面都加上使用的 shell 的名稱和命令編號) 。

復制代碼
代碼如下:

bash-1) # Demonstrate the differences between single-, double-, and back quotes
bash-2) var=ls
bash-3) echo '$var'
$var
bash-4) echo "$var"
ls
bash-5) echo `$var`
Rakefile app bin components config db
doc lib log patches public script src
test tmp vendor

在上面的命令序列中,把變量 var 設置為兩字母的字符串 ls。在第一個 echo 命令中,單引號禁止解釋此變量,因此會按原樣顯示引號中的文本,即四字母的字符串 $var。在第 4 行代碼中,雙引號會解釋此變量,所以結果是字符串 ls。最后,反撇號解釋變量并作為子 shell 運行中間結果。因此,`$var` 產生中間字符串 ls,它作為 shell 命令運行,生成當前目錄的內容列表。
當然,這三種操作符(單引號、雙引號和反撇號)都有合法的用途,但是與英語中的例外一樣,記住和掌握這些細微差異很令人頭疼。為了進一步證明這一點,請問:$var 和 "$var" 之間有什么差異?(提示:假設 $var 包含空格。)

復制代碼
代碼如下:

bash-1) # Create three files and try to remove two
bash-2) touch three two one
bash-3) var="one two"
bash-4) rm "$var"
rm: one two: No such file or directory
bash-5) rm $var
bash-6) ls
three

如果一個變量包含空格,雙引號會按原樣把變量展開為一個 參數。否則,變量中的任何空格都被解釋為參數分隔符。
shell 語法很令人頭疼。這很糟糕,因為它使 CLI(UNIX 最強大的特性之一)更難掌握。上面這樣的不一致問題甚至會給 UNIX 老手帶來困擾。
好在,fish (Friendly Interactive Shell) 的出現改變了這種混亂局面,它提供簡明的語法,顯著改善了用戶體驗。與其他 shell 一樣,fish 也提供重定向、快捷方式、globbing(即通配符的展開)、子 shell、制表符補全和變量。但是,與其他 shell 不同,fish 還提供顏色編碼的 CLI、功能豐富的命令行編輯器和大量文檔。
另外,對于執行任何操作,fish 只提供一種方式,這非常明智。如果一個 UNIX 實用程序能夠完成某一任務,fish 就不會通過內置命令重復提供此特性。例如,fish 使用系統范圍的應用程序 /bin/kill 終止進程。(與之相反,Bourne shell 通過一個內置應用程序實現了它自己的 kill 版本??梢栽?Bourne shell 命令提示上輸入 /bin/kill 來訪問此版本)。fish 盡可能優先考慮簡單性而不是靈活性,這顯著簡化了它的使用方法。
下面,我們來安裝 fish 并體驗它的一些特性。


獲取 fish
fish 是由 Axel Liljencrantz 創建的一個開放源碼項目,采用的許可協議是 GNU General Public License, version 2。到編寫本文時,fish 的最新版本是 1.23.0,此版本于 2008 年 1 月 13 日發布。
如果使用 UNIX 或 UNIX 類系統(比如 Linux® 或 Mac OS X),那么應該很容易在您的系統上從源代碼構建 fish。下面是構建步驟,見 清單 1:
下載程序的最新源代碼壓縮包。
解壓。
進入源代碼目錄。
配置構建。
運行 make。
清單 1. 從源代碼構建 fish

復制代碼
代碼如下:

bash-1) wget http://www.fishshell.org/files/1.23.0/fish-1.23.0.tar.gz
bash-2) tar xzvf fish-1.23.0.tar.gz
bash-3) cd fish-1.23.0
bash-4) ./configure --without-xsel
checking if autoconf needs to be run... no
checking if autoheader needs to be run... no
checking for /usr/pkg/include include directory... no
...
bash-5) make
gcc -c -o function.o function.c
...
bash-6) sudo make install
...
To use fish as your login shell:
* add the line '/usr/bin/fish' to the file '/etc/shells'.
* use the command 'chsh -s /usr/bin/fish'.

如果使用 UNIX 類系統,configure 可能不需要更多的標志。但是,為了盡可能減少依賴性并讓 fish 采用與常用 shell 相同的目錄結構,可以分別添加 --without-xsel 和 --prefix=/usr。(如果使用 Mac OS X version 10.4 Leopard,那么還要添加參數 LDFLAGS=-liconv。如果在 Mac OS X 上省略后一個選項,那么無法編譯附帶的 fish 實用程序) 。
另外,如果使用流行的 UNIX 版本,很可能會找到預先構建好的二進制版本,可以把它直接安裝在您的系統上。例如,如果使用 Debian Linux,那么可以用 sudo apt-get install fish 命令直接安裝 fish。請訪問 fish 項目的主頁,了解是否有針對您的系統的二進制版本。

入門
在討論比較復雜的主題之前,我們先看看在 fish 中如何完成一些常見的 shell 任務:
要想重定向標準輸入和標準輸出,應該分別使用操作符 < 和 >。要想重定向標準錯誤,應該使用 ^ 操作符,見 圖 1。使用 ^^ 把標準錯誤追加到一個文件中。
圖 1. 用 ^ 操作符重定向標準錯誤
20151211114539286.jpg (465×209)

在命令 3 中,rm 產生的錯誤消息被重定向到 errors 文件中。命令 4 顯示此文件的內容。fish shell 為重定向提供各種支持,比如把描述符組合成一個流和結束描述符。
順便說一句,文本的顏色和下劃線不是編輯出來的。shell 會在您輸入時在 CLI 中突出顯示文本。綠色表示命令名是有效的;無效的命令名用紅色表示。下劃線表示指定的文件存在。(后面一節詳細討論 shell 的反饋)。
使用圓括號(())運行子 shell,見 圖 2。圓括號中的文本被解釋為一系列命令,shell 會把它們替換為執行結果。
圖 2. 使用圓括號運行子 shell
20151211114601888.jpg (465×209)

通過創建 fish 函數創建別名(即快捷方式)。
函數可以包含一個或多個命令,特殊變量 $argv 會自動展開成命令行上傳遞的參數列表。
可以用 functions 命令列出已定義的所有函數。使用 functions --erase name 刪除函數,例如 functions --erase ll。
還可以立即保存在命令行上編寫的任何函數。在編寫完代碼時,輸入 funcsave name,例如 funcsave ll。在此之后,當前運行的所有 shell 和以后的所有 shell 都可以使用此函數??梢允褂?funced name 命令以交互方式編輯現有的函數。funced 命令提供語法突出顯示、制表符補全和自動縮進;funcsave 和 funced 使用戶能夠更方便地定制 shell。
輸入 set variable namevalue 來設置變量。與內置命令 functions 一樣,輸入 set --erase variable name 就可以刪除一個變量。輸入美元符號($)和變量名,就可以獲取變量中存儲的值,見 圖 3。
圖 3. 檢查一個變量是否存在
20151211114624758.jpg (465×209)

fish 提供 --query 選項來檢查是否定義了一個變量。如果已經設置了此變量,set --query 返回狀態碼 0,這表示沒有出現錯誤;否則,返回 1。語句 6 用 or 操作符連接兩個命令:第二個命令(echo)只在第一個命令失敗的情況下執行。
那么,fish 如何處理 $var、'$var'、"$var" 和 `$var` 呢?它遵守幾條簡單的規則:
如果變量包含空格,那么空格會被保留,變量總是作為單一參數,見 圖 4。
圖 4. fish 按原樣保留字符串中嵌入的空格
20151211114640619.jpg (447×531)

如果最外邊的引號是雙引號,那么展開所有變量。
如果最外邊的引號是單引號,那么不展開變量。
我們來看看這些規則的實際應用。
命令 1 創建四個 文件,最后一個文件的名稱包含空格。命令 3 和 4 刪除 file 變量指定的文件。命令 6 和 7 刪除 twofiles 變量指定的兩個文件。仔細看一下命令 6:因為值沒有放在引號(單引號或雙引號)中,所以不保留空格。因此,命令 7 把此變量展開成兩個參數并刪除兩個文件。命令 9 和 10 重復命令 6 和 7 中的場景。
命令 11 和 12 演示空格規則。盡管在命令 12 中變量沒有放在雙引號中,但是 fish 在命令 11 中保留空格。非常好。
命令 14 到 16 演示 fish 的嵌套引號規則。現在,再看一下命令 11、15 和 16。shell 使用顏色編碼顯示匹配的引號,以此確保語法正確。再看一下命令 9 和 11。后一個命令在文件名上顯示下劃線,這表示此文件存在。在命令 9 中沒有下劃線,這提示用戶某些地方出錯了。
fish 的首字母代表 Friendly,對用戶友好是它的主要目標。

對于新手非常有幫助的一個特性
說到對用戶友好,就不能不提到 fish 的制表符補全 特性,這個新穎的特性對于 UNIX 新用戶和專家都極其有幫助。為了體驗制表符補全,請按下面的示例操作。在每行的末尾按 Tab 鍵。
如果您不確定一個命令名的拼寫,可以在輸入幾個字母之后按 Tab,就會看到可能的完整命令的列表,見 圖 5。(在您的系統上顯示的命令列表可能與這里顯示的不一樣。此列表取決于 PATH 環境變量和您的 UNIX 系統的內容) 。
圖 5. 按 Tab 補全命令名
20151211114657988.jpg (465×349)

注意 CLI 中的紅色文本。如果 fish 不認識一個命令名,就用紅色顯示它。按 Tab,就會顯示以目前輸入的字母開頭的所有應用程序名(以及簡短的描述)。在空提示行上按 Tab,就會看到 PATH 中的所有應用程序。
如果想了解一個命令的可用選項,那么在連字符(-)或雙連字符(--)后面按 Tab,見 圖 6。
圖 6. 還可以通過按 Tab 補全一個選項
20151211114713573.jpg (465×349)

此時,fish 會顯示可用的選項。shell 維護許多常用命令和選項的索引,您很可能能夠得到所需的幫助。但是,定制的或更復雜的實用程序可能缺少這種數據。可以閱讀 fish 文檔,了解關于編寫自己的補全特性的更多信息。
還可以在輸入選項的幾個字母之后按 Tab,見 圖 7。shell 會顯示所有匹配的選項。
圖 7. 還可以輸入選項的一部分
20151211114742600.jpg (465×223)

如果您不知道一個命令處理的操作數類型,fish 在許多情況下可以提供幫助,但并不是在所有情況下都可以。例如,如果輸入 set(或 vared,即 fish 變量編輯器)和一個空格,然后按 Tab,fish 會顯示可用變量的列表。set 的操作數是一個變量。同樣,如果輸入 type 和一個空格,然后按 Tab,fish 會顯示內置函數的列表,這些函數擴展文件系統上可用的實用程序。
在一般情況下,fish 中的所有內置函數都有上下文相關的操作數補全。請試一下 cd,見 圖 8。
圖 8. 許多命令是上下文相關的,可以顯示適當的參數
20151211114801146.jpg (507×405)

cd 函數是一個 fish 函數,它的操作數是一個現有的目錄。在輸入 cd 之后按 Tab,fish 會顯示 CDPATH 中的每個目錄包含的所有現有目錄。
另一個智能化補全與 ssh 相關。輸入 ssh 和一個空格,然后按 Tab,就會看到從 Secure Shell 已知主機文件(通常在 ~/.ssh/known_hosts 中)獲取的已知主機名列表:、

復制代碼
代碼如下:

fish-1) ssh
login.example.com (Hostname)
host1.example.com (Hostname)

fish shell 還會補全文件名和目錄名。同樣,它會在您輸入路徑名時突出顯示正確的元素。
fish 與其他 shell 之間的一個重要差異是,它不提供歷史快捷方式,比如 !、!! 和 !$。

使用 fish 作為登錄 shell
如果您喜歡 fish,希望用它作為登錄 shell,那么把 fish 的路徑添加到正式 shell 列表(/etc/shells)中,然后運行 chsh:

復制代碼
代碼如下:

bash-1) type fish
fish is /usr/bin/fish
bash-2) sudo vi /etc/shells
Add the line /usr/bin/fish to the file if it's missing, and save the file
bash-3) cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/bin/fish
bash-4) chsh -s /usr/bin/fish
Changing shell for strike
Password: ********
bash-5) login strike
Password: ********
Last login: Wed Oct 8 15:02:21 on ttys000
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
fish-1) echo $SHELL
/usr/bin/fish

結束語
fish 中還有許多有用的特性值得研究。“fish 這條魚非常有營養。”
可以調整語法突出顯示采用的顏色??梢酝ㄟ^編輯 ~/.config/fish/config.fish 定制啟動過程??梢允褂猛ㄓ米兞?和 fishd 跨 shell 實例共享變量。這種 shell 還有出色的歷史搜索特性、交互式變量編輯器和交互式命令行編輯器。
最好的一點是,fish 本身提供大量文檔。如果需要幫助,只需在命令提示上輸入 help。
醫生的意見是對的:吃 “魚” 對您有益。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一本一本久久a久久精品综合小说| 91国产精品91| 国产精品一二区| 国产精品午夜一区二区欲梦| 永久免费看mv网站入口亚洲| 国产精品吊钟奶在线| 欧美激情一级精品国产| 久久久精品国产亚洲| 欧美在线视频在线播放完整版免费观看| 亚洲国产欧美一区二区三区同亚洲| 精品国产精品三级精品av网址| 日韩中文字幕视频在线观看| 91爱视频在线| 亚洲精品一区在线观看香蕉| 亚洲人成在线播放| 中文字幕亚洲激情| 色综合久久88色综合天天看泰| 色偷偷偷综合中文字幕;dd| 91精品国产乱码久久久久久蜜臀| 久久精品国产99国产精品澳门| 国产精品视频一区国模私拍| 亚洲国产成人爱av在线播放| 成人福利视频网| 国产精品69精品一区二区三区| 亚洲一区二区国产| zzijzzij亚洲日本成熟少妇| 久久在线视频在线| 26uuu另类亚洲欧美日本老年| 久久久精品网站| 欧美在线一级va免费观看| 亚洲一区二区福利| 日韩在线高清视频| 成人自拍性视频| 欧美激情精品久久久久久大尺度| 久久久日本电影| 中文字幕av一区二区三区谷原希美| 96精品视频在线| 欧美最近摘花xxxx摘花| 亚洲免费小视频| 国产热re99久久6国产精品| 欧美性极品xxxx娇小| 精品日本美女福利在线观看| 亚洲欧美日韩精品| 最新的欧美黄色| 51久久精品夜色国产麻豆| 亚洲精品av在线| 欧美成人性生活| 国产精品免费久久久| 国产精品xxxxx| 欧美性猛交丰臀xxxxx网站| 国产mv免费观看入口亚洲| 午夜免费久久久久| 国产精品视频自拍| 午夜精品久久久久久久99热浪潮| 国产精品视频一| 国产精品mp4| 国产精品永久免费| 九九视频直播综合网| 日本精品视频网站| 欧美亚州一区二区三区| 国产成人免费91av在线| 91精品国产91久久| 国产第一区电影| 国产午夜精品一区二区三区| 亚洲精品国产suv| 日韩激情av在线播放| 成人免费直播live| 日本精品免费观看| 国产成人精品久久| 久久99青青精品免费观看| 在线看国产精品| 亚洲色图18p| 亚洲伊人成综合成人网| 欧美极品美女视频网站在线观看免费| 欧美成人高清视频| 亚洲成年人在线| 欧美激情国产日韩精品一区18| 亚洲剧情一区二区| 精品国偷自产在线视频99| 日韩美女主播视频| 成人国产精品免费视频| 欧美高清视频在线观看| 亚洲老头同性xxxxx| xvideos成人免费中文版| 在线视频免费一区二区| 日本三级久久久| 午夜精品久久久久久99热软件| 亚洲已满18点击进入在线看片| 欧美日韩在线影院| 欧美色播在线播放| 国自在线精品视频| 日韩性xxxx爱| 日韩在线观看免费高清| 97涩涩爰在线观看亚洲| 国产午夜精品一区理论片飘花| 久久久久久久网站| 亚洲japanese制服美女| 色综合久久88色综合天天看泰| 欧美成人午夜视频| 毛片精品免费在线观看| 美乳少妇欧美精品| 中文字幕日本欧美| 欧美成人精品在线| 日韩在线视频一区| 欧美亚州一区二区三区| 欧美视频一二三| 国模gogo一区二区大胆私拍| 国产精品免费在线免费| 久久久久久久国产| 国产在线精品成人一区二区三区| 国产ts人妖一区二区三区| 亚洲国产日韩欧美在线动漫| 成人在线小视频| 国产精品色悠悠| 亚洲日本欧美日韩高观看| 欧美激情视频在线免费观看 欧美视频免费一| 最近的2019中文字幕免费一页| 一区二区欧美日韩视频| 国产精品偷伦视频免费观看国产| 久久深夜福利免费观看| 日韩精品免费电影| 欧美韩日一区二区| 亚洲精品美女久久| 日韩av电影国产| 91国产一区在线| 欧美性猛交xxxx免费看漫画| 欧洲日韩成人av| 中文字幕在线观看日韩| 欧美日韩国产页| 91精品久久久久久久久久另类| 亚洲国产黄色片| 国产91热爆ts人妖在线| 热久久99这里有精品| 亚洲国产精彩中文乱码av| 欧美日韩亚洲一区二区| 日韩亚洲综合在线| 国外日韩电影在线观看| 国产成人精品久久久| 国产国语刺激对白av不卡| 蜜臀久久99精品久久久久久宅男| 国产精品久久久精品| 亚洲一区二区免费| 国产精品自拍偷拍视频| 欧美日韩午夜视频在线观看| 国产精品高潮呻吟久久av野狼| 亚洲天堂成人在线| 亚洲欧美日本精品| 国产成人综合精品在线| 欧美激情亚洲一区| 国产在线观看91精品一区| 日韩精品在线视频观看| 国产日韩欧美在线视频观看| 国产一区二区三区18| 久久精品国产69国产精品亚洲| 97在线观看免费高清| 国内精品久久久久影院优| 精品福利在线观看| 日本成人免费在线| 日韩在线观看av| 色综合久久88| 亚洲综合精品一区二区| 久久久免费观看| 国产亚洲一区精品| 日韩在线www|