Shell十三問[轉]

来源:http://www.cnblogs.com/chownjy/archive/2016/11/24/6097113.html
-Advertisement-
Play Games

Shell十三問 轉載於網路,稍加整理。 <! more (一) 為何叫做Shell? 我們知道電腦的運作不能離開硬體,但使用者卻無法直接對硬體作驅動, 硬體的驅動只能透過一個稱為"操作系統(Operating System)"的軟體來控管 ,事實上, 我們每天所談的linux , 嚴格來說只是一 ...


Shell十三問


轉載於網路,稍加整理。

(一) 為何叫做Shell?

我們知道電腦的運作不能離開硬體,但使用者卻無法直接對硬體作驅動,硬體的驅動只能透過一個稱為"操作系統(Operating System)"的軟體來控管,事實上, 我們每天所談的linux , 嚴格來說只是一個操作系統, 我們稱之為"核心(kernel)"。然而,從使用者的角度來說,使用者也沒辦法直接操作 kernel ,而是透過 kernel 的"外殼"程式,也就是所謂的 shell ,來與 kernel 溝通。這也正是 kernel 跟 shell 的形像命名關係。

從技術角度來說, shell 是一個使用者與系統的互動界面(interface),主要是讓使用者透過命令行(command line)來使用系統以完成工作。因此, shell 的最簡單的定義就是---命令解譯器(Command Interpreter)

  • 將使用者的命令翻譯給核心處理,
  • 同時,將核心處理結果翻譯給使用者

每次當我們完成系統登入(log in), 我們就取得一個互動模式的 shell , 也稱為 login shell或 primary shell。
若從進程(process)角度來說,我們在 shell 所下達的命令,均是 shell 所產生的子進程。這現像,我們暫可稱之為 fork 。
如果是執行腳本(shell script)的話,腳本中的命令則是由另外一個非互動模式的子 shell(sub shell)來執行的。
也就是 primary shell 產生 sub shell 的進程, sub shell 再產生 script 中所有命令的進程。

(二) shell prompt(PS1) 與 Carriage Return(CR) 的關係?

當你成功登錄進一個文字界面之後,大部份情形下,你會在熒幕上看到一個不斷閃爍的方塊或底線(視不同版本而別),我們稱之為游標(coursor)
游標的作用就是告訴你接下來你從鍵盤輸入的按鍵所插入的位置,且每輸如一鍵游標便向右邊移動一個格子,若連續輸入太多的話,則自動接在下一行輸入。
假如你剛完成登錄還沒輸入任何按鍵之前,你所看到的游標所在位置的同一行的左邊部份,我們稱之為提示符號(prompt)。
提示符號的格式或因不同系統版本而各有不同,在 Linux 上,只需留意最接近游標的一個可見的提示符號,通常是如下兩者之一:
$:給一般使用者帳號使用
#:給 root (管理員)帳號使用

事實上, shell prompt 的意思很簡單:

  • 是 shell 告訴使用者:您現在可以輸入命令行了。

我們可以說,使用者只有在得到 shell prompt 才能打命令行,而 cursor 是指示鍵盤在命令行所輸入的位置,使用者每輸入一個鍵, cursor 就往後移動一格,直到碰到命令行讀進 CR(Carriage Return,由 Enter 鍵產生)字元為止。
CR 的意思也很簡單:

  • 是使用者告訴 shell:老兄你可以執行我的命令行了。

嚴格來說,所謂的命令行,就是在 shell prompt 與 CR 字元之間所輸入的文字。

系統可接受的命令名稱(command-name)可以從如下途徑獲得:

  • 明確路徑所指定的外部命令
  • 命令別名(alias)
  • 自定功能(function)
  • shell 內建命令(built-in)
  • $PATH 之下的外部命令

每一個命令行均必須含用命令名稱,這是不能缺少的。

echo知多少?

echo 是一個非常簡單、直接的 Linux 命令:
將 argument 送出至標準輸出(STDOUT),通常就是在監視器(monitor)上輸出。

先運行一下echo命令:

$ echo

$

會發現只有一個空白行,然後又回到 shell prompt 上了。
這是因為 echo 在預設上,在顯示完 argument 之後,還會送出一個換行符號(new-line
charactor)。
但是上面的 command 並沒任何的 argument ,那結果就只剩一個換行符號了...
若你要取消這個換行符號,可利用 echo-n option

$ echo -n
$

要想看看 echo 的 argument ,可試試如下的輸入:

$ echo hello
hello
$ echo -n hello
hello$

上兩個 echo 命令中,你會發現 argument 的部份顯示在你的熒幕,而換行符號則視 -n option 而定。
很明顯的,第二個 echo 由於換行符號被取消了,接下來的 shell prompt 就接在輸出結果同
一行了。

事實上, echo 除了 -n options 之外,常用選項還有:

-e :啟用反斜線控制字元的轉換
-E:關閉反斜線控制字元的轉換
-n :取消行末之換行符號

關於 echo 命令所支持的反斜線控制字元如下表:

\a: ALERT / BELL (從系統喇叭送出鈴聲)
\b: BACKSPACE ,也就是向左刪除鍵
\c:取消行末之換行符號
\E: ESCAPE,跳脫鍵
\f: FORMFEED,換頁字元
\n: NEWLINE,換行字元
\r: RETURN,回車鍵
\t: TAB,表格跳位鍵
\v: VERTICAL TAB,垂直表格跳位鍵
\n: ASCII 八進位編碼(以 x 開首為十六進位)
\\:反斜線本身

(四) " "‘ ’的區別?

經過前面兩章的學習,應該很清楚當你在 shell prompt 後面敲打鍵盤、直到按下 Enter 的時
候,你輸入的文字就是 command line 了,然後 shell 才會以行程的方式執行你所交給它的命令。
但是,在 command line 輸入的每一個文字,對 shell 來說,是有類別之分的!
簡單而言, command line 的每一個 charactor ,分為如下兩種:

  • literal:也就是普通純文字,對 shell 來說沒特殊功能。
  • meta:對 shell 來說,具有特定功能的特殊保留字元。

Literal 沒甚麼好談的,凡舉 abcd、 123456 這些"文字"都是 literal ,但 meta 卻常使我們困惑。
事實上,前兩章我們在 command line 中已碰到兩個機乎每次都會碰到的 meta :

  • IFS:由 <space><tab><enter> 三者之一組成(我們常用 space )。
  • CR:由 <enter> 產生。

IFS 是用來拆解 command line 的每一個詞(word)用的,因為 shell command line 是按詞來處理的。
而 CR 則是用來結束 command line 用的,這也是為何我們敲

=   : 設定變數。
$   : 作變數或運算替換(請不要與 shell prompt 搞混了)>   :重導向 stdout<   :重導向 stdin|   :命令管線。
&   :重導向 file descriptor ,或將命令置於背境執行。
( ) :將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ } :將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍。
;   :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&&  :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
||  :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。
!   :執行 history 列表中的命令

假如我們需要在 command line 中將這些保留字元的功能關閉的話,就需要 quoting 處理了。在 bash 中,常用的 quoting 有如下三種方法:

  • hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
  • soft quote: " "(雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如$ )。
  • escape : \ (反斜線),只有緊接在 escape (跳脫字元)之後的單一 meta 才被關閉。

下麵的例子將有助於我們對 quoting 的瞭解:

$ A=B C # 空格鍵未被關掉,作為 IFS 處理。
$ C: command not found.
$ echo $A
$
$ A="B C" # 空格鍵已被關掉,僅作為空格鍵處理。
$ echo $A
B C

在第一次設定 A 變數時,由於空格鍵沒被關閉, command line 將被解讀為:

  • A=B 然後碰到<IFS>,再執行 C 命令。在第二次設定 A 變數時,由於空格鍵被置於 soft quote 中,因此被關閉,不再作為 IFS :
  • A=B<space>C

空格鍵無論在 soft quote 還是在 hard quote 中,均會被關閉。 Enter 鍵亦然。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 成功新建了一個虛擬機,在使用之前,必須進行各種配置 一,為虛擬機分配使用的記憶體 在Hyper-V Manager中,選中一個VM,點擊Settings,配置VM使用的記憶體資源。 使用動態記憶體時,為虛擬機分配記憶體,Startup記憶體是10GB,最小記憶體10GB,最大記憶體20GB; 二,為VM加域 1, ...
  • Linux中的文件管理機制是一種叫掛載和卸載的方式使用分區中的文件。 1.硬碟分區的概念 概述:首先我們要對硬碟分區的基本概念進行一些初步的瞭解,硬碟的分區主要分為基本分區(Primary Partion)和擴展分區(Extension Partion)兩種, 基本分區和擴展分區的數目之和不能大於四 ...
  • 1.設置佈局文件,自定義ratingbar樣式 2.在activity中設置監聽器 3.效果圖 ...
  • 使用Hyper-V創建VM,在VM成功安裝OS之後,發現VM只有一個邏輯盤C,用於存儲VM的操作系統。在產品環境中,需要向VM增加虛擬硬碟,便於將數據單獨存儲在不同的邏輯盤符中。在Hyper-V中,分兩步向VM中增加虛擬硬碟(Virtual Hard Disk): 在Hyper-V Manager中 ...
  • 一、VMware tools 通過VMware tools來實現主機和VM共用文件,詳細介紹 記得重啟就能實現本機和虛擬機之間複製粘貼文件。 二、搭建java環境: 一般linux都會預裝openjdk,先將其卸載。 1.下載dk-8u5-linux-x64.tar.gz文件,tar.gz格式只是一 ...
  • 已經在安裝CentOS時設置了中文輸入法,在“設置”-“區域與語言”選項里也可以看到如下圖所示的界面,但在文檔中切換後無法使用的問題: 方法:點擊輸入源向中的“+”,再點擊“更多”(即向下的省略號): 接著在最下行的搜索框中輸入“China”,選擇“漢語(Intelligent Pinyin)”,點 ...
  • vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對操作系統的虛擬記憶體、進程、CPU活動進行監控。他是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因為 vmstat 本身就是低開銷工具 ...
  • 常用的linux 命令 1查看Linux版本 1.1 查看linux的內核版本 uname -r 或者uname -a 1.2 查看linux的具體版本號 cat /proc/version 1.3 查看Linux系統的主機名 hostname 2 啟動或關閉FTP服務 service vsftp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...