通过在bash别名

时间:2017-09-04 18:48:29

标签: 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'

但是我仍然在码头里闲逛。有人会这么善良地指导我吗?

3 个答案:

答案 0 :(得分:1)

一个好的解决方案是使用函数(而不是别名)。

<强>为什么吗 因为别名应该仅用于简单的修改(比如在命令中添加额外的参数/标志)。

因此,我们可以创建一个函数,也可以创建一个shellcript。在我们的例子中,因为这是一个非常简单的问题,我们可以创建一个函数。

你应该在.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(使用源.bash_profile或创建一个新会话),你就可以在控制台上执行dumpdb,就像它是一个别名一样。

答案 1 :(得分:1)

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 "$1" >backup.sql
}

dumpdb "my_database"

${PWD##*/}将扩展为父工作目录的基本名称;如果$PWD/home/user/stuff,则${PWD##*/}将为stuff

如果您没有为重定向到的文件指定目录名,则该文件将以当前工作目录结束,因此不需要使用pwd

答案 2 :(得分:1)

我的评论没有足够的声誉,而Kusalananda的回答很完美。

对于任何需要更通用解决方案的人来说,这对于Kusalananda的答案来说都是一个小调整。

dumpdb () {
   docker exec "$1" \
      mysqldump -uroot --password=secret "$2" > sql/dump.sql
}

这样,您可以传递2个参数。一个用于容器,一个用于数据库名称。

您可以简单地调用该函数: dumpdb example_container_1数据库

如果要提供其他参数,只需输入$ 3,$ 4等,然后调用函数dumpdb arg1 arg2 arg3 arg4等