題 用於 '#!'在* nix腳本中


在許多Apple / Unix腳本中,我看到“#”之前的內容,據我所知,這意味著它是一個註釋。但是通常你會看到shell調用如下(與 #!)。

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

我想知道這是否只是一個評論或它實際上做了什麼。感謝您的專家建議:-)


4
2018-02-23 11:18


起源


好問題! +1 - studiohack♦
可能重複 究竟是什麼解釋#!/ bin / bash行? - Chris Johnsen


答案:


這是一種定義在執行腳本期間應該調用哪個shell的方法。它被稱為 家當

例如,具有以下Shebang行的文件:

#!/bin/sh

會調用Bourne(sh)shell。例如,你的腳本:

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

將使 /sbin/route add SUBNET $5 在Bourne shell解釋器中運行。 /sbin/route add SUBNET $5 只是一個評論,沒有做任何事情。然而,shebang應該在第一行,因此在頂部的評論將不允許shebang做它的工作,使它成為無用的補充。

有許多解釋器被廣泛使用,一些典型的shebang線解釋器是:

  • #!/bin/sh  - 使用sh,Bourne shell(或兼容的shell)執行
  • #!/bin/csh  - 使用csh,C shell(或兼容的shell)執行
  • #!/usr/bin/perl  - 使用Perl執行
  • #!/usr/bin/python  - 使用Python執行
  • #!/usr/bin/php  - 使用PHP的命令行解釋器執行

正如奧利在評論中提到的,有時候 env (環境簡稱)用於確保選擇正確的解釋器路徑。


16
2018-02-23 11:20



實際上對於非標準的東西(例如perl,python和php),最好使用它 env: #!/usr/bin/env perl, 例如。這將自動為perl選擇正確的路徑,即使它不是 /usr/bin。 - Olli
@Olli它只是一些例子! ;)但你當然是對的...... - BloodPhilia
shebang必須是第一行,所以最初的註釋行將阻止第二行做任何事情。另一種經常使用的風格是 #!/usr/bin/env python這通常會導致腳本被任何東西運行 python 先發生在 PATH。這很有用,因為有時可執行文件安裝在不同的地方,因此無需修改腳本即可運行。在少數情況下, env 位於其他地方,所以即使這樣也失敗了。 - Dennis Williamson
@Olli現在快樂xD? - BloodPhilia
@Olli:在文件系統層次結構標準下,必須在單用戶模式下可用的“基本”程序必須放在 /bin,而 /usr 是非必要的程序,所以 /bin/sh 比一個更安全的賭注 /usr/bin/env  - 它總是有可能的 /usr 畢竟,可能沒有安裝。我同意 /usr/bin/env perl 肯定比 /usr/bin/perl但是。 - Dave Sherohman


更多技術解釋:

在UNIX / Linux / Windows / SomeOS / AnyOS上運行可執行文件時,系統需要知道如何運行它。在UNIX / Linux中,文件的前幾個字節的特殊規則告訴內核如何運行它。對於腳本,特殊字符為“#!”。如果內核將此視為前兩個字符,則它知道該文件是一個腳本,並查看該行的其餘部分以查找運行該腳本的可執行文件。所以如果文件/path/to/script.sh啟動:

#!/bin/sh

內核會看到'#!',知道它是一個腳本並找到並運行/ bin / sh並將腳本文件路徑/path/to/script.sh作為參數傳遞。由於所有腳本解釋器(bash,perl,csh,python等)都使用'#'作為註釋字符,因此它們都會忽略這個'家當'作為評論。

你可能以前從未見過這個,因為Windows完全不同地處理它。在Windows上,它不使用這些“魔術”字符,而是將文件擴展名映射到運行它的方式。


4
2018-02-23 23:35