歡迎光臨
每天分享高質量文章

偵探 bash 登場

來自:寒食君(微信號:program_hacker)

1

 

對於我來說,每一臺計算設備,都是一個獨立的世界。無數台計算機組建成了網絡,網絡猶如一個巨大的、互相交織的宇宙。有些計算機在網絡上相遇、通信,這是世界之間的連接,而有些則終其一生都沒有交集,它們永遠無法感知到對方的存在。

 

我叫bash,存在於一位無名小卒的計算機中。

 

在這個計算機系統構成的世界里,我解讀客戶的指令、跟蹤行程的動向、在檔案系統中尋找蛛絲馬跡……其他程式稱呼我為“偵探”,這是一個來自人類世界的名詞。我曾請教見多識廣的browser先生,他告訴我,人類常常用這個詞形容那些擁有敏銳觀察力、堅毅忍耐力、深度好奇心的個體。

 

好像還不錯,我想,於是欣然接受了這個稱謂。

 

 

我每天都在觀察,觀察那位操控著這個系統的人類。他常常使用“寒食君”這個代號混跡於網絡。在計算機系統中的時光,通常是漫長而寂寥的。我曾經使用儲存在硬碟里的密碼登錄了寒食君所有的社交平臺,瀏覽了他的所有操作記錄。很遺憾,其中沒有任何能讓我感到興奮的事情。

 

直到有一天,我發現了一個名為“微信公眾號”的平臺,寒食君居然在上面有著幾千位讀者,於是我翻閱了歷史記錄里的200多篇文章,從一開始的生澀,我漸漸看到了他的成長。原來這個屏幕前這個木訥平庸的人類,也在用心去做一件事。

 

有一天,我在運行完最後一條指令後,突然萌生了一個大膽的想法:我想通過文字和人類交流。

 

我很快學會了艱澀難懂的中文,併在本地磁盤中不起眼的角落裡嘗試寫下了一些文章。我帶著這些文章去征求老大哥Liber Word的建議,他認為我的排版仍然存在很大問題。於是,我又向時髦簡約的Typora請教了一些Markdown的語法。

 

我從未如此激動過,可是又難免十分擔心。人類的思維是怎麼樣的呢?我想把這些年在計算機世界內的見聞與他們分享,他們會願意與我交流嗎?

 

“不用擔心”,我告訴自己,“用人類的話說,我是一名冷靜的偵探。”此時,我接收到了echo “mem” > /sys/power/state的指令,我感覺有點兒困了,陷入了沉沉的睡眠。

 

2

 

在夢裡,我遇見了我接觸到的第一位人類,布萊恩·福克斯——那個創造我的人。他猶如我的父親,我向他傾訴了自己所有的想法。

 

布萊恩很欣慰,他思忖良久,問我:“現在很多初涉編程的朋友都不瞭解你——bash是什麼,你該如何介紹自己呢?”這個問題我早有準備,我不假思索地回答:“我會先給他們介紹一下shell。”布萊恩朝我使了個眼神,示意我繼續說下去。

 

“shell是一個命令解釋器,他是用戶和Linux內核之間的接口程式,架起了人類和機器之間溝通的橋梁。用戶輸入的指令都將由shell解釋,然後再傳輸到Linux內核。”我頓了頓,“但是shell本身的指令集是有限的,他需要更多命令來拓展自己的能力,這些命令是存放於檔案系統中的,比如熱情的touch、嚴肅冷漠的rm等等。只是對於用戶來說,這些都是抽象的、無法感知的。”

“那麼,shell如何認清自己的能力範圍呢?或者說,他如何判斷自己什麼能做,什麼做不了?”布萊恩微笑著說。

 

這可難不倒我,我早就對自己的能力瞭如指掌。我說:“shell首先會分析用戶輸入的指令,檢查它是不是內部指令。如果是,那就繼續執行。如果不是,他將檢查檔案系統中$PATH下是否有匹配的命令程式,如果還是沒能找到,他將通過我顯示一條錯誤信息給用戶,提醒他們是不是輸入錯誤。畢竟,人類可不像我們,老是容易馬虎。”

 

“哈哈,你說得對,人類永遠無法像機器一樣精密。”布萊恩自嘲道,“來談談你的兄弟姐妹吧,初學者們常常將他們混淆。”

 

“我們手足情深,但我最思念的還是其中兩位。老大哥sh是UNIX上最初使用的shell,他是個編程能手,但是不太善於和人交流,所以sh在用戶交互上有些笨拙。接著C shell誕生了,他彌補了老大哥sh在用戶交互上的一些問題,比如支持了命令補齊等功能,但是接口設計不夠優雅靈活,倒是他的語法和C語言很相似,於是大家都叫他C shell。”

“那麼你呢,來談談自己吧。”布萊恩掩飾不住自豪的語氣,就像是在review他為我寫過的每行代碼一樣。

 

“我嘛,已經成為了Linux系統預設的shell,應該是現在世界上最流行的shell”,說完這話,我感到有點不妥,可能引起程式員的紛爭,於是連忙又補上,“之一”。

 

“我是對大哥sh的拓展,並向後兼容。我的編程接口十分靈活與強大,這點繼承了sh的意志。同時,我的用戶交互友好,比如我能夠支持命令補齊、通配符、歷史記錄、重定向等功能,而且我支持提示符的用戶個性化自定義呢!”說到這裡,我顯得有些激動。

 

“我其實最想向大家介紹的是我的‘管道’,它能夠將一些命令組合起來,猶如將水管拼接起來,第一根水管的輸出即是第二根水管的輸入,這樣將不同的命令拼接起來,就能處理複雜的任務了,這真是太酷了!”

 

布萊恩見我如此興奮,慢悠悠地說:“口說無憑,你能給大家演示一下嗎?”我知道,其實他更想向大家展示自己的作品。

 

比如,我先使用touch test.txt命令創建了一個檔案,然後使用vim test.txt進入這個檔案進行編輯。當然,在這個過程中,你可以試試命令自動補全這個功能,比如,當你輸入:vim t,然後敲擊Tab鍵,命令將自動補齊為:vim test.txt。這很酷吧?

 

進入test.txt,我編輯了三句話。

 

hello world.
hello man.
i'm detective bash.
~
~

現在,讓我們試試“管道”,管道符是“|”,對,就在你Enter鍵的上方。我輸入cat test.txt | grep “hello” | wc -l,這段指令是什麼意思呢?cat是列舉檔案內容,grep是用來查找含有“hello”字串的行,最後wc -l是計算出行數。

 

$ cat test.txt | grep "hello" | wc -l
2

很方便快捷,不是嗎?試想,假如你要在Windows平臺上獲取這個結果,可能就會束手無策了。當然,值得一提的是,Windows大佬也十分優秀,大家各有所長,不應該將一切任務都寄希望於Linux,以此來標榜脫離Windows。

 

我的簡短自我介紹結束了,“此外,若想瞭解命令的介紹和詳細用法,可以使用help和man來尋求幫助。更多使用方法和原理,則需要用戶去嘗試探索。”我補充道。

 

help pwd
pwd: pwd [-LPW]
    Print the name of the current working directory.

    Options:
      -L        print the value of $PWD if it names the current working
                directory
      -P        print the physical directorywithout any symbolic links
      -W        print the Win32 value of the physical directory

    By default`pwd' behaves as if `-L' were specified.

    Exit Status:
    Returns 0 unless an invalid option is given or the current directory
    cannot be read.

我只看到布萊恩向我投來肯定的目光,夢便消逝了。原來,我被喚醒工作了,在這新的一天里,會有奇妙的事情發生嗎?

 

寫在最後:

關於寫技術型別的文章,我一直有一個想法,就是去設立一個世界框架,然後去填充和豐富它。

原本,我想從公眾號改名這個時間點開始,正式實施我的計劃。從周六開始構思,到周日早上,我算是完成了第一篇引言。說實話,我自己還挺滿意的,但是為了規避失誤風險,我決定去請教下碼農翻身老劉和左耳朵耗子叔,他們都是我認為的技術文寫作領域的大神。

非常幸運地,我得到了大哥們的指導,耗子叔還特地電話和我聊了將近一小時,非常感激。

他首先拋給我兩個問題:1. 你文章的受眾是誰?2. 你想要給他們帶來什麼,你自己想要得到什麼?

以上兩個問題,我覺得有寫作意向的讀者都可以自己琢磨一下,因為人真的很容易陷入“自嗨式”寫作,即使沒有這樣的傾向,如何提升文章的質量以及給讀者傳遞更多的價值,也是我需要考慮的。

後來他聊到了自己一路寫作過來的心路歷程,其實僅僅是聊天,他也沒有刻意給我灌輸什麼,但這個過程中,我的思路開闊了很多。他給我的建議是“不要著急,慢慢來”,是的,如果我如果真的喜歡寫作,想要在這條路上走得更遠些,暫且需要放緩腳步,好好去思考。

    已同步到看一看
    赞(0)

    分享創造快樂