Linux 工具:點(diǎn)的含義 | Linux 中國(guó)

在現(xiàn)實(shí)情況中,使用 shell 命令編寫的單行命令或腳本可能會(huì)令人很困惑。你使用的很多工具的名稱與它們的實(shí)際功能相差甚遠(yuǎn)(grep、tee和awk,還有嗎?),而當(dāng)你將兩個(gè)或更多個(gè)組合起來(lái)時(shí),所組成的 “句子” 看起來(lái)更像某種外星人的天書。

因此,上面說(shuō)的這些對(duì)于你并無(wú)幫助,因?yàn)槟阌脕?lái)編寫一連串的指令所使用的符號(hào)根據(jù)你使用的場(chǎng)景有著不同的意義。

位置、位置、位置

就拿這個(gè)不起眼的點(diǎn)(.)來(lái)說(shuō)吧。當(dāng)它放在一個(gè)需要一個(gè)目錄名稱的命令的參數(shù)處時(shí),表示“當(dāng)前目錄”:

find . -name "*.jpg"

意思就是“在當(dāng)前目錄(包括子目錄)中尋找以.jpg結(jié)尾的文件”。

ls .和cd .結(jié)果也如你想的那樣,它們分別列舉和“進(jìn)入”到當(dāng)前目錄,雖然在這兩種情況下這個(gè)點(diǎn)都是多余的。

而一個(gè)緊接著另一個(gè)的兩個(gè)點(diǎn)呢,在同樣的場(chǎng)景下(即當(dāng)你的命令期望一個(gè)文件目錄的時(shí)候)表示“當(dāng)前目錄的父目錄”。如果你當(dāng)前在/home/your_directory下并且運(yùn)行:

cd ..

你就會(huì)進(jìn)入到/home。所以,你可能認(rèn)為這仍然適合“點(diǎn)代表附近目錄”的敘述,并且毫不復(fù)雜,對(duì)吧?

那下面這樣會(huì)怎樣呢?如果你在一個(gè)文件或目錄的開頭加上點(diǎn),它表示這個(gè)文件或目錄會(huì)被隱藏:

1、$ touch somedir/file01.txt somedir/file02.txt somedir/.secretfile.txt

2、$ ls -l somedir/

3、total 0

4、-rw-r--r-- 1 paul paul 0 Jan 13 19:57 file01.txt

5、-rw-r--r-- 1 paul paul 0 Jan 13 19:57 file02.txt

6、$ # 注意上面列舉的文件中沒有 .secretfile.txt

7、$ ls -la somedir/

8、total 8

9、drwxr-xr-x 2 paul paul 4096 Jan 13 19:57 .

10、drwx------ 48 paul paul 4096 Jan 13 19:57 ..

11、-rw-r--r-- 1 paul paul 0 Jan 13 19:57 file01.txt

12、-rw-r--r-- 1 paul paul 0 Jan 13 19:57 file02.txt

13、-rw-r--r-- 1 paul paul 0 Jan 13 19:57 .secretfile.txt

14、$ # 這個(gè) -a ?選項(xiàng)告訴 ls 去展示“all”文件,包括那些隱藏的

然后就是你可以將.當(dāng)作命令。是的,你聽我說(shuō):.是個(gè)真真正正的命令。它是source命令的代名詞,所以你可以用它在當(dāng)前 shell 中執(zhí)行一個(gè)文件,而不是以某種其它的方式去運(yùn)行一個(gè)腳本文件(這通常指的是 Bash 會(huì)產(chǎn)生一個(gè)新的 shell 去運(yùn)行它)

很困惑?別擔(dān)心 —— 試試這個(gè):創(chuàng)建一個(gè)名為myscript的腳本,內(nèi)容包含下面一行:

myvar="Hello"

然后通過(guò)常規(guī)的方法執(zhí)行它,也就是用sh myscript(或者通過(guò)chmod a+x myscript命令讓它可執(zhí)行,然后運(yùn)行./myscript)?,F(xiàn)在嘗試并且觀察myvar的內(nèi)容,通過(guò)echo $myvar(理所當(dāng)然你什么也得不到)。那是因?yàn)?,?dāng)你的腳本賦值"Hello"給myvar時(shí),它是在一個(gè)隔離的bash shell 實(shí)例中進(jìn)行的。當(dāng)腳本運(yùn)行結(jié)束時(shí),這個(gè)新產(chǎn)生的實(shí)例會(huì)消失并且將控制權(quán)轉(zhuǎn)交給原來(lái)的shell,而原來(lái)的 shell 里甚至都不存在myvar變量。

然而,如果你這樣運(yùn)行myscript:

. myscript

echo $myvar就會(huì)打印Hello到命令行上。

當(dāng)你的.bashrc文件發(fā)生變化后,你經(jīng)常會(huì)用到.(或source)命令,就像當(dāng)你要擴(kuò)展PATH變量那樣。在你的當(dāng)前 shell 實(shí)例中,你可以使用.來(lái)讓變化立即生效。

雙重麻煩

就像看似無(wú)關(guān)緊要的一個(gè)點(diǎn)有多個(gè)含義一樣,兩個(gè)點(diǎn)也是如此。除了指向當(dāng)前目錄的父級(jí)之外,兩個(gè)點(diǎn)(..)也用于構(gòu)建序列。

嘗試下這個(gè):

echo {1..10}

它會(huì)打印出從 1 到 10 的序列。在這種場(chǎng)景下,..表示 “從左邊的值開始,計(jì)數(shù)到右邊的值”。

現(xiàn)在試下這個(gè):

echo {1..10}

它會(huì)打印出從 1 到 10 的序列。在這種場(chǎng)景下,..表示 “從左邊的值開始,計(jì)數(shù)到右邊的值”。

現(xiàn)在試下這個(gè):

echo {1..10..2}

你會(huì)得到1 3 5 7 9。..2這部分命令告訴 Bash 輸出這個(gè)序列,不過(guò)不是每個(gè)相差 1,而是相差 2。換句話說(shuō),就是你會(huì)得到從 1 到 10 之間的奇數(shù)。

它反著也仍然有效:

echo {10..1..2}

你也可以用多個(gè) 0 填充你的數(shù)字。這樣:

echo {000..121..2}

會(huì)這樣打印出從 0 到 121 之間的偶數(shù)(填充了前置 0):

000 002 004 006 ... 050 052 054 ... 116 118 120

不過(guò)這樣的序列發(fā)生器有啥用呢?當(dāng)然,假設(shè)您的新年決心之一是更加謹(jǐn)慎控制您的帳戶花銷。作為決心的一部分,您需要?jiǎng)?chuàng)建目錄,以便對(duì)過(guò)去 10 年的數(shù)字發(fā)票進(jìn)行分類:

mkdir {2009..2019}_Invoices

工作完成。

或者你可能有數(shù)百個(gè)帶編號(hào)的文件,比如從視頻剪輯中提取的幀,或許因?yàn)槟撤N原因,你只想從第 43 幀到第 61 幀每隔三幀刪除一幀:

rm frame_{043..61..3}

很可能,如果你有超過(guò) 100 個(gè)幀,它們將以填充 0 命名,如下所示:

frame_000 frame_001 frame_002 ...

那就是為什么你在命令中要用043,而不是43的原因。

花括號(hào)花招

說(shuō)實(shí)話,序列的神奇之處不在于雙點(diǎn),而是花括號(hào)({})的巫術(shù)??纯此鼘?duì)于字母是如何工作的。這樣做:

touch file_{a..z}.txt

它創(chuàng)建了從file_a.txt到file_z.txt的文件。

但是,你必須小心。使用像{Z..a}這樣的序列將產(chǎn)生一大堆大寫字母和小寫字母之間的非字母、數(shù)字的字符(既不是數(shù)字或字母的字形)。其中一些字形是不可打印的或具有自己的特殊含義。使用它們來(lái)生成文件名稱可能會(huì)導(dǎo)致一系列意外和可能令人不快的影響。

最后一件值得指出的事:包圍在{...}的序列,它們也可以包含字符串列表:

touch {blahg, splurg, mmmf}_file.txt

將創(chuàng)建了blahg_file.txt、splurg_file.txt和mmmf_file.txt。

當(dāng)然,在別的場(chǎng)景中,大括號(hào)也有不同的含義(驚喜嗎?。?。不過(guò)那是別的文章的內(nèi)容了。

總結(jié)

Bash 以及運(yùn)行于其中的各種工具已經(jīng)被尋求解決各種特定問題的系統(tǒng)管理員們把玩了數(shù)十年。要說(shuō)這種有自己之道的系統(tǒng)管理員是一種特殊物種的話,那是有點(diǎn)輕描淡寫。總而言之,與其他語(yǔ)言相反,Bash 的設(shè)計(jì)目標(biāo)并不是為了用戶友好、簡(jiǎn)單、甚至合乎邏輯。

但這并不意味著它不強(qiáng)大 —— 恰恰相反。Bash 的語(yǔ)法和 shell 工具可能不一致且很龐大,但它們也提供了一系列令人眼花繚亂的方法來(lái)完成您可能想象到的一切。就像有一個(gè)工具箱,你可以從中找到從電鉆到勺子的所有東西,以及橡皮鴨、一卷膠帶和一些指甲鉗。

除了引人入勝之外,探明你可以直接在 shell 中達(dá)成的所有能力也很有趣,所以下次我們將深入探討如何構(gòu)建更大更好的 Bash 命令行。

在那之前,玩得開心!



via:https://www.linux.com/blog/learn/2019/1/linux-tools-meaning-dot

作者:Paul Brown[3]選題:lujun9972譯者:asche910校對(duì):wxy

本文由LCTT原創(chuàng)編譯,Linux中國(guó)榮譽(yù)推出

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章 1.Linux是一套免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),它可以基于Intel x86系列處理器以及Cy...
    yansicing閱讀 5,579評(píng)論 0 9
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,334評(píng)論 0 10
  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,219評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,714評(píng)論 0 5
  • “你怎么變成這樣了,你以前不是這樣的!” 成長(zhǎng)過(guò)程中需要經(jīng)歷的事 mp.weixin.qq.com/s/DBSm7...
    Zhannnnng閱讀 615評(píng)論 5 1

友情鏈接更多精彩內(nèi)容