2011-05-02 21 views
19

嘿,我一直在使用Linux一段時間,並認爲是時候最終深入shell腳本。在Perl或Python上使用Bash是否有優勢?

問題是我沒有發現使用Bash而不是Perl或Python之類的任何顯着優點。兩者之間是否存在性能差異或功率差異?我認爲就能力和效率而言,Python/Perl會更適合。

回答

6

Perl腳本通常(如果不是100%的時間)比bash快。

上的討論:Perl vs Bash

3

在Python或Perl腳本POSIX shell腳本的最重要的優點是POSIX shell可用幾乎所有的Unix機器上。 (還有一些任務shell腳本稍微更方便一些,但這不是一個主要問題。)如果可移植性對您來說不是問題,我認爲不需要學習shell腳本。

+0

每個Unix機器都附帶Perl – tchrist 2011-05-03 12:55:19

+0

@tchrist:在你說的一般性中,這只是明顯的錯誤 – 2011-05-03 12:57:55

+0

命名你的異常。 – tchrist 2011-05-03 18:34:43

2

如果你想執行機器上安裝的程序,沒有什麼比擊敗bash。您可以隨時通過Perl或Python進行系統調用,但是我發現讀取返回值是一件麻煩的事情。

而且既然您知道它可以在任何時間的任何地方工作...

+0

我不知道Python支持'syscall',因爲這些Perl示例顯示Perl會:'syscall(&SYS_gettimeofday,$ tv,undef)> = 0'或'syscall(&SYS_setgroups,scalar @newgids,pack(「i *「,@newgids))' – tchrist 2011-05-03 18:35:49

+0

」系統「調用我的意思是」對外殼「。不是文字系統調用。我不知道Perl可以做到這一點。 – drysdam 2011-05-03 19:05:35

+0

我看到炮製出一個系統調用是非常不同的事情。其中一個只是像shell一樣調用一些用戶級程序,另一個則直接進入內核而沒有任何麻煩或大驚小怪。第一個必須使用許多系統調用;第二,必然是一個。 – tchrist 2011-05-03 20:02:37

4

好處是它就在那裏。除非你使用Python(或Perl)作爲你的shell,否則編寫一個腳本來做一個簡單的循環就是一大堆額外的工作。

簡而言之,調用其他程序的簡單腳本,我將使用Bash。如果我想保留輸出結果,那麼我可以交易到Python。

例如:

for file in *; do process $file ; done 

其中process是一個程序,我想對每個文件運行,或...

while true; do program_with_a_tendency_to_fail ; done 

否則無論那些在Python或Perl的是矯枉過正。

對於實際編寫的程序,我期望隨着時間的推移維護和使用,Bash很少是工作的正確工具。特別是因爲大多數現代Unices都帶有Perl和Python。

+1

試試這個代替你的第一個例子(少打字,多[parallel](http:/ /www.gnu.org/software/parallel/)):'ls |並行過程' – Sebastian 2011-05-02 15:35:21

+2

@塞巴斯蒂安:神奇!雖然我認爲'並行進程 - *'更接近。 – nmichaels 2011-05-02 16:05:33

+1

ls | xargs進程也會以相同的方式工作,但所有這些方法都有一個bug:它們不能用空格或換行符的文件名工作。執行「$ f」;完成 – ijw 2011-05-02 19:17:11

1

shell腳本的優勢在於它全局存在於* ix盒子中,並且具有相對穩定的核心功能,您可以依靠它來隨處運行。使用Perl和Python,你必須擔心它們是否可用,以及它是否可用,因爲它們的整個生命週期中存在嚴重的語法不兼容問題。 (特別是如果你包含Python 3和Perl 6.)

shell腳本的缺點是其他的一切。 Shell腳本語言通常缺乏表現力,功能和性能。並且在沒有強大的字符串處理功能和庫的情況下從字符串中一起黑入命令行,以確保轉義是正確的,引發安全問題。除非有一個令人信服的兼容性原因,否則你需要使用shell,我個人會每次都爲腳本語言豐富。

+0

Perl 6被安裝爲不同的可執行文件,所以你可以在任何情況下使用Perl 5。 – 2011-05-03 08:26:30

16

兩大優勢浮現在腦海中:

  • 簡單:直接訪問所有美好的Linux工具wclscatgrepsed ...等 爲什麼經常使用Python的subprocess模塊?
  • 我越來越喜歡使用gnu parallel,您可以使用它來並行執行bash腳本。例如。從該名男子頁,批量並行創建目錄下的所有JPG格式的豎起大拇指:

    ls *.jpg | parallel convert -geometry 120 {} thumb_{}

順便說一句,我通常在我的bash腳本一些Python電話(例如,用於繪製)。使用任何最適合的任務!

4

bash不是一種語言,就像一個命令解釋器,它被砍死以允許看起來像腳本語言的東西。對於最簡單的1-5行一次性任務來說非常棒,但在Perl或Python中像數組操作一樣簡單的事情在bash中是非常醜陋的。我還發現,慶典傾向於不通過拇指的兩個關鍵規則:

  1. 6個月的規則,它說,你應該能夠很容易地辨別的目的和腳本的基本力學你寫的,但避風港」在6個月內看了看。

  2. '每分鐘WTF'規則。每個人都有自己的限制,而我的規模很小。一旦我達到3 WTF /分鐘,我在別處尋找。

至於在腳本語言如Perl和Python「脫殼而出」,我發現,我幾乎從來沒有需要這樣做,FWIW(聲明:我在Python代碼幾乎100%)。 Python os和shutil模塊大部分時間都是我最需要的,並且內置了用於處理tarfiles,gzip文件,zip文件等的模塊。有一個glob模塊,一個fnmatch模塊......有很多那裏的東西。如果你遇到需要並行化的東西,那麼將你的代碼縮進一個級別,把它放在一個'run()'方法中,把它放在一個擴展了threading.Thread或multiprocessing.Process的類中,實例化你想調用每一個'start()'。一般不超過5分鐘即可獲得並行執行。

祝你好運。希望這可以幫助。

+0

我同意,除了我從shell到Perl的切換限制是10-20行。 – reinierpost 2011-05-03 08:50:29

+0

Bourne shell(忽略bash--你通常不得不求助於bash擴展來編寫shell腳本)並沒有被「砍死」,而是一種腳本語言 - 它可能已經有30年的歷史了,基本的編程特性從一開始就像循環,條件和功能一樣。 – ijw 2011-05-07 12:16:56

4

對於大型項目,使用像Perl這樣的語言。

有幾件事情你只能在bash中完成(例如,改變調用環境(當腳本來源而不是運行時),而且shell腳本也是司空見慣的事情,值得學習基礎和學習你的方式圍繞可用的文檔

再加上有些時候瞭解一個shell可以節省您的培根(在叉式轟炸系統,您無法啓動任何新進程,或者如果/usr/bin和或/usr/local/bin無法安裝)

相關問題