通过在 bash 别名中连接 pwd 和字符串来构建实体名称
Build entity name by concatenating pwd and string in bash alias
This answer很有见地,但我仍然有点挣扎。
我想要的是创建一个别名,我可以用它来备份 docker 容器中的 mysql 数据库。
本例中的 Container 名称是工作目录和文本字符串的组合:directory_name_1
.
我想要运行(github gist)的命令是这样的:
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
将备份文件放入工作目录。
我试过了
alias dumpdb='docker exec `pwd`_my-string mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
以及
的变化
alias WORKING_DIR="pwd | rev | cut -d "/" -f1 | rev"
alias DOCKER_CONTAINER='echo $(WORKING_DIR)_my-wpdb_1'
alias dumpdb='docker exec $(DOCKER_CONTAINER) mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
但我仍在码头上闲逛。有好心人指导一下吗?
一个好的解决方案是使用函数(而不是别名)。
为什么?
因为别名应该只用于简单的修改(比如向命令添加额外的 argument/flag)。
因此,我们可以创建一个函数,也可以创建一个shellscript。在我们的例子中,因为这是一个非常简单的问题,我们可以创建一个函数。
你应该写在.bash_profile
因此,例如,您可以尝试定义以下函数
function dumpdb()
{
local wkdir="basename $(pwd)"
local container="${wkdir}_my-wpdb_1"
docker exec ${container} mysqldump -uroot --password=password DATABASE > backup.sql
}
写完之后,重新加载 bash_profile(使用 source .bash_profile 或创建新会话),您将能够在控制台上执行 dumpdb,就像它是别名一样。
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql
}
或者,作为别名:
alias dumpdb='docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql'
通过使用函数,您可以将数据库名称传递给它,例如:
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password "" >backup.sql
}
dumpdb "my_database"
${PWD##*/}
将扩展为父工作目录的基本名称;如果 $PWD
是 /home/user/stuff
,那么 ${PWD##*/}
将是 stuff
。
如果您没有为重定向到的文件指定目录名称,该文件将最终位于当前工作目录中,因此没有必要使用 pwd
。
我没有足够的声誉来发表评论,而 Kusalananda 的回答非常完美。
对于任何需要更通用解决方案的人来说,这是对 Kusalananda 答案的一点调整。
dumpdb () {
docker exec "" \
mysqldump -uroot --password=secret "" > sql/dump.sql
}
这样你可以传递2个参数。一个用于容器,一个用于数据库名称。
您可以简单地调用该函数:
dumpdb example_container_1 数据库
如果您想提供更多参数,只需输入 $3、$4 等并调用函数 dumpdb arg1 arg2 arg3 arg4 等
This answer很有见地,但我仍然有点挣扎。
我想要的是创建一个别名,我可以用它来备份 docker 容器中的 mysql 数据库。
本例中的 Container 名称是工作目录和文本字符串的组合:directory_name_1
.
我想要运行(github gist)的命令是这样的:
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
将备份文件放入工作目录。
我试过了
alias dumpdb='docker exec `pwd`_my-string mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
以及
的变化
alias WORKING_DIR="pwd | rev | cut -d "/" -f1 | rev"
alias DOCKER_CONTAINER='echo $(WORKING_DIR)_my-wpdb_1'
alias dumpdb='docker exec $(DOCKER_CONTAINER) mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'
但我仍在码头上闲逛。有好心人指导一下吗?
一个好的解决方案是使用函数(而不是别名)。
为什么? 因为别名应该只用于简单的修改(比如向命令添加额外的 argument/flag)。
因此,我们可以创建一个函数,也可以创建一个shellscript。在我们的例子中,因为这是一个非常简单的问题,我们可以创建一个函数。
你应该写在.bash_profile
因此,例如,您可以尝试定义以下函数
function dumpdb()
{
local wkdir="basename $(pwd)"
local container="${wkdir}_my-wpdb_1"
docker exec ${container} mysqldump -uroot --password=password DATABASE > backup.sql
}
写完之后,重新加载 bash_profile(使用 source .bash_profile 或创建新会话),您将能够在控制台上执行 dumpdb,就像它是别名一样。
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql
}
或者,作为别名:
alias dumpdb='docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password DATABASE >backup.sql'
通过使用函数,您可以将数据库名称传递给它,例如:
dumpdb () {
docker exec "${PWD##*/}_my-wpdb_1" \
mysqldump -uroot --password=password "" >backup.sql
}
dumpdb "my_database"
${PWD##*/}
将扩展为父工作目录的基本名称;如果 $PWD
是 /home/user/stuff
,那么 ${PWD##*/}
将是 stuff
。
如果您没有为重定向到的文件指定目录名称,该文件将最终位于当前工作目录中,因此没有必要使用 pwd
。
我没有足够的声誉来发表评论,而 Kusalananda 的回答非常完美。
对于任何需要更通用解决方案的人来说,这是对 Kusalananda 答案的一点调整。
dumpdb () {
docker exec "" \
mysqldump -uroot --password=secret "" > sql/dump.sql
}
这样你可以传递2个参数。一个用于容器,一个用于数据库名称。
您可以简单地调用该函数: dumpdb example_container_1 数据库
如果您想提供更多参数,只需输入 $3、$4 等并调用函数 dumpdb arg1 arg2 arg3 arg4 等