curl
不可用時Makefile
發現db top
db
捷徑db
功能db
的子命令db connections
db pga
(例如pg_activity
)bin/tablet
腳本bin/specs
腳本執行測試bin/spec -P
依序運行 SpecsMakefile
並行運行測試Makefile
依序執行測試徽章 | 福薩掃描 | |
---|---|---|
福斯薩 | ||
持續集成測試 | ||
持續整合安裝 | ||
外殼檢查 | ||
吉特 |
Bashmatic®是一個 BASH 框架,意味著它是 BASH 函數(近 900 個)的集合,我們希望使 BASH 編程變得更容易、更愉快,更重要的是,有趣- 因為該庫專注於為開發人員提供當使用Bashmatic 助手的腳本運行時,不斷回饋正在發生的事情。
提示 | 我們建議您從本文檔的 PDF 版本中了解 Bashmatic,該版本更適合列印。
|
安裝庫後(預設位置是~/.bashmatic
),請意識到您可以選擇:
透過新增下列行,從 shell「點檔案」(如~/.bash_profile
)自動取得程式庫(以及所有 900 多個函數) : source ~/.bashmatic/init.sh
。在最近的 M1 Apple 筆記型電腦上,這總共增加了大約 100 毫秒。
或者,可以在登入初始化期間跳過它,並且僅在使用該庫的腳本的頂部加載它。
警告 | 這兩種方法都是絕對有效的,而且各有優缺點。在點檔中載入 bashmatic 可能有點冒險。不管怎樣,我們很快就會提供方法來驗證您每次下載的 bashmatic 都是安全且正確的版本。 |
關於這個問題,我們要說的是,我們對庫的採購進行了最佳化。這是一個例子:
Bashmatic®的程式風格深受 Ruby DSL 語言的影響。如果您快速瀏覽一下 is.sh 腳本,它定義了一堆可以與&&
和||
連結的 DSL 函數。建立一個緊湊且自記錄的程式碼,如下所示:
[向下箭頭圈]
# An example of a DSL-like function
function bashmatic.auto-update() {
local dir= " ${1 :- " ${BASHMATIC_HOME " }} "
is.a-directory " ${dir} " && {
file.exists-and-newer-than " ${dir} /.last-update " 30 && return 0
(
cd ${BASHMATIC_HOME} &&
git.is-it-time-to-update &&
git.sync-remote
)
}
}
# check if the function is defined and call it
is.a-function.invoke bashmatic.auto-update " $@ "
要在您自己的腳本中使用它,您需要先研究下面提供的範例,並利用lib
下提供的每個模組。
最後注意,一旦 Bashmatic 安裝並由 shell 初始化檔案載入後,您可以輸入is.<tab><tab>
來查看以is
開頭的可用函數。 lib
下的每個模組通常定義以檔案名稱開頭的公共函數。例如, array.sh
中的函數通常以array.<something>.<action>
開頭
Bashmatic®提供了大量不斷增長的輔助函數,用於運行命令、自動重試、可重複、運行時測量執行框架以及關鍵函數run
。每種情況都有幫助程序,從繪製方框、線條、標題到顯示進度條、獲取用戶輸入、安裝包等等。
筆記 | Bashmatic®中的大部分幫助程式都是為 OS-X 編寫的,儘管許多有用的功能也可以在 Linux 下運作。我們的整個測試套件都在 Ubuntu 上運行。目前正在努力將 Homebrew 特定的函數轉換為與作業系統無關的幫助程序,例如在 Linux 上同樣運行良好的package.install 。 |
透過下面的範例部分開始探索Bashmatic® 。當您準備好後,可以在函數索引頁面中找到完整的整套公用函數(其中近 500 個)。
最後,不用擔心, Bashmatic®是完全開源的,可以免費使用和擴展。我們只是喜歡它帶有一點®的外觀:)
BASH 版本 4+
BASH版本3(部分相容,部分功能被停用)
ZSH – 截至最近的更新,Bashmatic 幾乎 90% 與 ZSH 相容。
目前不支援
FISH(儘管您可以透過bin/bashmatic
腳本幫助程式或其執行檔使用 Bashmatic)
該專案源自於幾位非常資深且經驗豐富的工程師的簡單實現,即:
使用 BASH 來編寫諸如通用安裝程式(又稱安裝腳本) 、上傳程式、各種功能的包裝程式(例如NPM 、 rbenv 、安裝 gems、rubies、使用 AWS、部署程式碼等)通常更容易。
BASH 函數的傳回值非常適合緊湊的 DSL(領域特定語言),其中多個函數可以透過邏輯 AND &&
和 OR ||
連結起來。提供非常緊湊的執行邏輯。最重要的是,我們認為這個邏輯非常容易閱讀和理解。
儘管有上述幾點,人們普遍認為:
許多 BASH 腳本寫得非常糟糕,很難閱讀和理解。
通常很難理解腳本運行時到底發生了什麼,因為它要么沒有輸出任何有用的東西,要么輸出太多。
當 BASH 錯誤發生時,通常情況會很糟糕,有人決定用 C++ 或 Go 重寫 20 行 BASH 腳本,因為,好吧,這是一個該死的 BASH 腳本,而且不起作用。
提示 | Bashmatic的目標是使 BASH 程式設計既有趣又一致,並為使用者提供大量可見的輸出,以便使用者清楚地了解正在發生的事情。 |
也許安裝Bashmatic®最簡單的方法是使用curl
,如下所示。
首先,確保你已經安裝了 Curl,運行which curl
來查看。然後將此命令複製/貼上到您的終端中。
[向下箭頭]
bash -c " $( curl -fsSL https://bashmatic.re1.re ) ; bashmatic-install -q "
[向上箭頭]
在哪裡:
-q 代表「安靜」;
-v 表示“詳細”
提示 | URL https://bashmatic.re1.re重定向到 Github Bashmatic Repo 中bin/bashmatic-install 腳本的 HEAD。我們使用此 URL 是為了保留將來在需要時將安裝重定向到不同腳本的能力。 |
如果您希望能夠在執行直接從 Internet 傳送的程式碼之前檢查腳本,我不會怪您。你很謹慎,也很聰明。
對於像您這樣的人,這裡有一種更安全的方法來完成相同的事情:
export script= " /tmp/install "
curl -fsSL https://bashmatic.re1.re > /tmp/install
chmod 755 /tmp/install
# At this point you can examine /tmp/install
/tmp/install --help
/tmp/install --verbose --debug # install with extra info
此方法允許您在運行/tmp/install
腳本之前檢查它。
下面是一些解釋
您可以透過傳遞-b / --git-branch <tag|branch>
標誌來安裝 Bashmatic 的分支或標籤。
您可以將標誌傳遞給bashmatic-install
函數來控制 Bashmatic 的安裝方式、安裝位置以及下載位置,包括:
-v
或--verbose
用於顯示附加輸出,或相反:
-d
或--debug
將列印額外的偵錯輸出
-f
或--force
將用新資料夾取代任何現有的 bashmatic 資料夾
-q
或--quiet
表示無輸出
-l
或--skip-on-login
不安裝在登入時載入 Bashmatic 的鉤子。
如果您喜歡在非標準位置安裝 Bashmatic(預設為~/.bashmatic
),您可以使用-H PATH
標誌
例如,這裡我們將 Bashmatic 安裝到非預設目標,同時列印額外的詳細和調試信息,以及使用-f
(強制)根據 Bashmatic 的簽出可能覆蓋目標文件夾(如果它已經存在)到標籤v2.4.1
:
bash -c " $( curl -fsSL https://bashmatic.re1.re ) ;
bashmatic-install -d -v -f -b v2.4.1 -H ~/workspace/bashmatic "
如果您在本地安裝了 SSH 金鑰,並且使用您在 Github 上的帳戶配置了公鑰,您可能需要使用[email protected]:kigster/bashmatic
origin 安裝 Bashmatic,而不是預設的https://github.com/kigster/bashmatic
:
以下是安裝程式接受的選項的完整清單:
當您執行bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install"
時,通常會發生以下情況:
curl
下載bin/bashmatic-install
腳本並將其傳遞給內建 BASH 進行評估。
評估後,將呼叫函數bashmatic-install
,該函數實際上執行安裝。
這是接受上面列出的參數的函數。
該腳本可能會要求您輸入密碼才能啟用 sudo 存取 - OS-X 上可能需要此密碼才能安裝 XCode Developer 工具(包括git
)
如果您的 BASH 版本為 3 或更早版本,則該腳本將從 BASH 版本 5+ 的來源下載並構建,並將其安裝到/usr/local/bin/bash
中。此步驟可能需要 SUDO。
在 OS-X 上,腳本將在 OS-X 上安裝 Homebrew(如果尚未安裝)。
安裝 Brew 後,就會安裝 Brew 軟體包coreutils
和gnu-sed
,因為 Bashmatic 需要並依賴這兩個軟體包。
然後,該腳本將嘗試將 bashmatic 儲存庫git clone
到 Bashmatic 主資料夾中,或 - 如果它已經存在 - 它將git pull
最新更改。
最後,除非您指定-l
或--skip-on-login
否則腳本將檢查您的 bash 點文件,並添加掛鉤以從~/.bashrc
或~/.bash_profile
加載 Bashmatic。
最後一部分我需要一些解釋。
現在,您可能想也可能不想在登入時載入 Bashmatic。
換句話說,你的~/.bashrc
中有類似的內容:
# Let's see if ~/.bashrc mentions Bashmatic:
$ grep bashmatic ~ /.bashrc
[[ -f ~ /.bashmatic/init.sh ]] && source ~ /.bashmatic/init.sh
即時存取 Bashmatic© 提供的 800 多個便利功能和幫助程式。每當從主分支載入時,Bashmatic 都會自動更新。
登入時大約有134 毫秒的延遲,並且存在潛在的安全攻擊向量(例如,如果有人破解了儲存庫)。
提示 | 我們最近顯著改進了整個 Bashmatic© 函數的載入時間。此前,加載 854 個函數需要花費近 900 毫秒,幾乎整整一秒。今天不超過 180 毫秒: |
❯ time source init.sh
real 0m0.134s
user 0m0.078s
sys 0m0.074s
如果上面的命令顯示了您在上面看到的輸出,那麼當您 grep bashrc
或zshrc
時,所有 Bashmatic 函數都會載入到您的 shell 中。這可能非常方便,例如,
您可以呼叫ruby.install-ruby-with-readline-and-openssl 3.0.1
來安裝 Ruby。
您可以呼叫gem.remote.version sym
來查看sym
的最後發布版本是3.0.1
。
您可以使用 with array.join ", " apple pear orange
連接一個值數組
注意:Bashmatic 的載入時間通常不超過 200-300 毫秒。也就是說,您可能不希望在您的環境中擁有這麼多 shell 函數,因此在這種情況下,您可以透過傳遞-l
或--skip-on-login
來跳過登入掛鉤。
安裝它:
bash -c " $( curl -fsSL https://bashmatic.re1.re ) ; bashmatic-install -l "
在這種情況下,我們建議您只需將 Bashmatic 的bin
資料夾新增至$PATH
。
例如:
# ~/.bashrc
export BASHMATIC_HOME= " ${HOME} /.bashmatic "
export PATH= " ${BASHMATIC_HOME} /bin: ${PATH} "
然後您將可以存取可執行腳本bashmatic
它可以用作所有 bashmatic 函數的「網關」:
你可以像這樣使用它: bashmatic <function> <args>
:
重要的 | 下面的範例假設您已將PATH 設定為包含${HOME}/.bashmatic/bin |
# Eg, if as in the previous example you sourced in Bashmatic:
$ bashmatic.version
2.1.2
# If you have not, you can still invoke 'bashmatic.version':
$ bashmatic version
# Or another function, 'array.join' — if you sourced in init.sh:
$ array.join ' | ' hello goodbye
hello | goodbye
# Or using the script:
$ bashmatic array.join ' | ' hello goodbye
hello | goodbye
如果發生錯誤,可能Bashmatic®沒有正確安裝。
curl
不可用時因此,對於curl
可能無法使用的情況,請提供以下適用於Linux/Ubuntu和基於OS-X的系統的shell函數。它可以輕鬆地透過新作業系統進行擴展:
# @description Installs bashmatic dependency into the ~/.bashmatic folder.
function install_bashmatic() {
# install bashmatic using https:// URL instead of git@
command -v curl > /dev/null || {
local OS= $( uname -s )
local code
case ${OS} in
Linux)
apt-get update -yq && apt-get install curl -yqq
code= $?
(( code )) && sudo apt-get update -yq && sudo apt-get install curl -yqq
;;
Darwin)
command -v brew > /dev/null || /bin/bash -c " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh ) "
hash -r
brew install curl
;;
* )
echo " OS ${OS} is not supported. "
;;
esac
}
[[ -d ~ /.bashmatic ]] || bash -c " $( curl -fsSL https://bashmatic.re1.re ) ; bashmatic-install -q -m https "
return 0
}
若要發現可用函數的廣度,請鍵入以下命令以查看所有匯入的 shell 函數:
# List all functions using 4-column mode; print top 5 lines.
❯ bashmatic functions 4 | head -5
7z.a db.psql.connect.db-set hl.yellow-on-gray run.inspect-variables
7z.install db.psql.connect.db-set hr run.inspect-variables-
7z.unzip db.psql.connect.just-d hr.colored run.inspect.set-skip-f
7z.x db.psql.connect.table- http.servers run.on-error.ask-is-en
7z.zip db.psql.connect.table- https.servers run.print-command
# or, to get the count of all functions, use 1 column output:
$ bashmatic functions 1 | wc -l
773
要手動安裝 Bashmatic,請按照以下步驟操作(如果您願意,可以隨意更改BASHMATIC_HOME
):
export BASHMATIC_HOME= " ${HOME} /.bashmatic "
test -d " ${BASHMATIC_HOME} " ||
git clone https://github.com/kigster/bashmatic.git " ${BASHMATIC_HOME} "
cd " ${BASHMATIC_HOME} " && ./bin/bashmatic-install -v
cd - > /dev/null
有時您可能無法使用git
(我見過從本機憑證不匹配到舊版本的 git 等問題),但也許可以使用curl
下載。在這種情況下,您可以尋找最新的標籤(用該標籤取代下面的「v1.6.0」),然後發出以下命令:
export BASHMATIC_TAG= " v2.4.1 "
set -e
cd ${HOME}
curl --insecure -fSsl
https://codeload.github.com/kigster/bashmatic/tar.gz/ ${BASHMATIC_TAG}
-o bashmatic.tar.gz
rm -rf .bashmatic && tar xvzf bashmatic.tar.gz && mv bashmatic- ${BASHMATIC_TAG} .bashmatic
source ~ /.bashmatic/init.sh
cd ${HOME} /.bashmatic && ./bin/bashmatic-install -v
cd ~ > /dev/null
您始終可以使用bashmatic.reload
函數重新載入Bashmatic® 。這只是執行${BASHMATIC_HOME}/init.sh
的來源。
當您安裝 Bashmatic 時,它會自動為您的~/.bash_profile
添加一個鉤子,但如果您使用 ZSH,您可能需要手動添加它(目前)。
將以下內容新增至您的~/.zshrc
檔案:
[[ -f ~ /.bashmatic/init.sh ]] && source " ~/.bashmatic/init.sh "
筆記 | 在 ZSH 和最新的 MacBook Pro 上載入整個程式庫的時間不到 300 毫秒。 |
Makefile
發現頂級Makefile
主要是為了方便而提供,因為它封裝了 Bashmatic 作者在開發中使用的一些常見任務,以及對任何探索 Bashmatic 的人有用的其他任務。
您可以執行make help
並讀取可用的目標:
❯ make
help Prints help message auto-generated from the comments.
open-readme Open README.pdf in the system viewer
docker-build Builds the Docker image with the tooling inside
docker-run-bash Drops you into a BASH session with Bashmatic Loaded
docker-run-fish Drops you into a FISH session with Bashmatic Loaded
docker-run-zsh Drops you into a ZSH session with Bashmatic Loaded
docker-run Drops you into a BASH session
file-stats-git Print all files known to ` git ls-files ` command
file-stats-local Print all non-test files and run ` file ` utility on them.
install-dev Installs the Development Tooling using dev-setup script
install-ruby Installs the Bashmatic default Ruby version using rbenv
install install BashMatic Locally in ~ /.bashmatic
release Make a new release named after the latest tag
tag Tag this commit with .version and push to remote
setup Run the comprehensive development setup on this machine
shell-files Lists every single checked in SHELL file in this repo
test Run fully automated test suite based on Bats
test-parallel Run the fully auto-g mated test suite
update-changelog Auto-generate the doc/CHANGELOG (requires GITHUB_TOKEN env var set)
update-functions Auto-generate doc/FUNCTIONS index at doc/FUNCTIONS.adoc/pdf
update-readme Re-generate the PDF version of the README
update-usage Auto-generate doc/USAGE documentation from lib shell files,
to doc/USAGE.adoc/pdf
update Runs all update targets to regenerate all PDF docs and the
Changelog.
我在一組可能對您有用的常見任務周圍添加了空格。
讓我們快速瀏覽一下這裡提供的內容。
提供 Makefile 是為了方便執行最常見的任務,並簡化執行一些需要記住許多參數的更複雜的任務,例如make setup
。您可能出於多種原因想要使用 Makefile:
make open-readme
此任務將在 PDF 系統檢視器中開啟 PDF 版本的自述文件。
make install
這允許您在本地安裝 Bashmatic 框架。它只是運行bin/bashmatic-install
腳本。這最多會為您的 shell 初始化檔案添加掛鉤,以便在登入時載入 Bashmatic。
make setup
此任務會在背景呼叫bin/dev-setup
腳本,以便您可以設定本機電腦開發人員設定以進行軟體開發。
現在,此腳本提供了非常豐富的 CLI 介面,因此您可以直接執行腳本並對其正在執行的操作進行細粒度控制,也可以透過此 make 目標使用預設標誌來執行它。
這個特定的 make 目標透過以下操作來執行bin/dev-setup
腳本:
dev, cpp, fonts, gnu, go, java, js, load-balancing, postgres, ruby
make test
和make test-parallel
都適用於 Bashmatic 開發者和貢獻者。請參閱貢獻部分,以了解如何運作以及對 UNIT 測試的期望。
make update
是庫貢獻者在進行更改後應該運行的任務,並且希望自動生成的文檔反映添加的新功能等等。此任務還會產生函數索引,重新產生README
、 USAGE
或CHANGELOG
檔案的最新 PDF。
筆記 | 提交任何拉取請求都需要執行make update 。 |
Bashmatic 隨附了一個 Dockerfile,可用於執行測試或手動驗證 Linux 下的各種功能,並可能進行實驗。
執行make docker-build
以建立 docker 映像bashmatic:latest
。
執行make docker-run-bash
(或…-zsh
或…-fish
)以使用您最喜歡的 shell 啟動容器,然後驗證您的函數是否按預期工作。
請注意這如何讓我直接進入已安裝 Bashmatic 的 Linux 環境提示符號。
為什麼我們需要另一個 BASH 框架?
眾所周知,BASH 過於冗長且不可靠。我們不敢苟同。這就是為什麼我們想用幾個例子來開始這個自述文件。
看看這個小小的五行腳本:
#! /usr/bin/env bash
source ${BASHMATIC_HOME} /init.sh
h2 " Installing ruby gem sym and brew package curl... "
" Please standby... "
gem.install " sym " && brew.install.package " curl " &&
success " installed sym ruby gem, version $( gem.version sym ) "
結果是詳細的,說實話,華麗的ASCII 輸出:
告訴我您對立即開始在 BASH 中編寫複雜的安裝流程一點也不興奮嗎?
您不僅可以獲得漂亮的輸出,還可以查看每個執行的命令、它的退出狀態、是否成功(綠色/紅色),以及每個命令的血腥持續時間(以毫秒為單位)。有什麼不喜歡的?
還是不相信?
接下來來看一個更全面的範例。
在此範例中,我們將下載二進位檔案kubectl
和minikube
二進位檔案並將其安裝到/usr/local/bin
我們在examples/k8s-installer.sh
中提供了範例腳本。請點擊並查看來源。
這是運行該腳本的輸出:
為什麼我們認為這種類型的安裝程式非常棒,與「Jim-in-the-corner」編寫但現在無人理解的無聲但致命的 shell 腳本相比?
因為:
該腳本不遺餘力地向用戶過度傳達其功能。
它允許並提醒您一次乾淨的逃離(Ctrl-C)
它共享其運行的確切命令及其計時,以便您可以關注網路擁塞或網路位址等問題。
它以綠色顯示每個命令的退出代碼“0”。如果任何命令失敗,您將看到它呈現紅色。
它的原始碼簡潔、明確且易於閱讀。沒有魔法。只是 BASH 函數。
筆記 | 如果您需要建立 BASH 安裝程序, Bashmatic®可以提供一些令人難以置信的節省時間的方法。 |
讓我們回到現實,談談如何安裝 Bashmatic,以及如何更詳細地使用它。
最後這個功能最豐富的範例不僅僅是一個範例 -它是一個工作功能工具,可用於在您的 Apple 筆記型電腦上安裝一堆開發人員依賴項。
筆記 | 該腳本在後台依賴 Homebrew,因此無法在 Linux 或 Windows 上運行(除非 Brew 移植到那裡)。 |
它位於bin/dev-setup
中,並且有許多 CLI 標誌:
在下面的範例中,我們將使用dev-setup
腳本來安裝以下內容:
開發工具
PostgreSQL
雷迪斯
記憶體快取
紅寶石2.7.1
NodeJS/NPM/紗線
儘管這是一個很長的列表,但我們可以透過一個命令將其全部安裝。
我們將從安裝應用程式的資料夾中運行它,因為這樣就會從我們的.ruby-version
檔案中自動偵測到 Ruby 版本,並且除了安裝所有依賴項之外,該腳本還將運行bundle install
和npm install
(或yarn install
)。不錯吧?
${BASHMATIC_HOME} /bin/dev-setup
-g " ruby postgres mysql caching js monitoring "
-r $( cat .ruby-version )
-p 9.5 # use PostgreSQL version 9.5
-m 5.6 # use MySQL version 5.6
這個緊湊的命令列安裝了大量的東西,但不要相信我們的話 - 自己運行它。或者,至少享受這張極長的螢幕截圖:)
這是一個很棒的工具,幾乎可以為任何其他工具的輸出著色。
像這樣運行它:
${BASHMATIC_HOME} /bin/install-grc
您可能需要輸入 SUDO 的密碼。
完成後,執行source ~/.bashrc
(或您使用的任何 shell),然後輸入ls -al
或netstat -rn
或ping 1.1.1.1
之類的內容,並注意以上所有內容的顏色都很漂亮。
db top
db
捷徑如果您正在使用 PostgreSQL,那麼您很幸運! Bashmatic 包括 PostreSQL 的 CLI 實用程式psql
的許多幫助程式。
筆記 | 在開始之前,我們建議您將 Bashmatic 的conf 目錄中的.psqlrc 檔案安裝到您的主資料夾中。雖然不是必需的,但此檔案為 PostgreSQL 設定提示符和各種宏,如果您定期使用psql 它們將非常方便。 |
db top
到底是什麼?
就像使用常規top
一樣,您可以看到本機系統上執行的「頂級」資源消耗進程,使用dbtop
您可以觀察最多同時在三個資料庫伺服器上主動執行的查詢的自刷新報告。
以下是dbtop
針對兩個即時資料庫運行的像素化螢幕截圖:
為了使其工作,您必須先在位於以下路徑的 YAML 檔案中定義資料庫連接參數: ~/.db/database.yml
。
以下是檔案的組織方式(如果您曾經使用過 Ruby on Rails,則標準config/database.yml
檔案應該完全相容):
development :
database : development
username : postgres
host : localhost
password :
staging :
database : staging
username : postgres
host : staging.db.example.com
password :
production :
database : production
username : postgres
host : production.db.example.com
password : " a098098safdaf0998ff79789a798a7sdf "
有了上面的文件,您應該能夠運行以下命令來查看所有可用的(在上面的 YAML 文件中註冊的)連接:
$ db connections
development
staging
production
一旦工作正常,您應該能夠運行dbtop
: