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
: