Bash 腳本中的執行檔與庫
在閱讀Google 的 shell 樣式指南時,我發現以下行讓我有點困惑:“執行檔應該沒有副檔名(強烈推薦)或 .sh 副檔名。庫必須有 .sh 副檔名並且不應該是可執行的。” 連結至少在 bash 腳本方面,執行檔和 bash 腳本庫之間到底有什麼區別?庫中的腳本不是執行檔嗎?
至少在 bash 腳本方面,執行檔和 bash 腳本庫之間到底有什麼區別?
我還沒有聽說過用於 shell 腳本的片語“庫”,如果我願意的話,我建議程序需要拆分為庫的事實意味著最好在一些更好的程式中實現它語。
也就是說,我希望 shell 程式中的庫類似於其他程式語言中的庫:為其他程序提供函式和子常式以供其他程序使用,但它本身並沒有對這些工具*做任何特別的事情。*例如,一個庫可能會提供用於壓縮/解壓縮某些數據的工具,但它需要一個使用該庫的程序來實現一個用於壓縮/解壓縮在命令行中命名的文件的命令行工具。
實際上,在 shell 中實現的程序將像任何程序一樣正常執行,而 shell 庫將只包含函式定義,並且來自另一個 shell 腳本,將這些定義拉入。
例如,在下面的兩個文件中,我可能會呼叫
main
一個程序和functions.sh
一個庫。main
可以使其可執行並執行為./main
. (或放置在 中$PATH
,但functions.sh
也需要在$PATH
其中source
才能找到它。)請注意,雖然您可以執行 egbash functions.sh
,但它不會做任何事情。
main
:#!/bin/bash source functions.sh say hello world
functions.sh
:say() { printf "%s\n" "$*" }
關於沒有擴展的可執行程序的要點可能與不公開實現有關。程序的使用者不需要知道它是如何實現的,如果在 Perl 中重新實現了一個 shell 腳本,如果不呼叫它就不會那麼混亂
foo.sh
,如果不需要更改名稱(需要修改給程序的所有使用者)。但是,shell 函式庫只能從 shell 腳本中使用,因此在那裡公開實現確實有意義。