通过在 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 等