通过连接bash别名中的pwd和字符串来构建实体名称

问题描述:

This answer非常有见地,但我仍然在努力一点。通过连接bash别名中的pwd和字符串来构建实体名称

我想要的是创建一个别名,我可以用它来在Docker容器中备份mysql数据库。

本例中的容器名称是工作目录和文本字符串的连接: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'

但我仍然在码头上闲逛。有人会如此好心引导我吗?

+1

是否必须使用别名?也可以通过创建一个函数来实现。 –

+0

你的意思是像一个bash脚本,然后我可以理论上创建一个别名?我只是想简化流程。 – MikeiLL

+0

'> $(pwd)/ backup.sql'与'> ./ backup.sql'相同,它与'> backup.sql'相同。我没有看到您关于备份位置的问题。 – Kusalananda

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

为什么? 因为别名只能用于简单的修改(如向命令添加额外的参数/标志)。

因此,我们可以创建一个函数或一个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(使用源的.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 "$1" >backup.sql 
} 

dumpdb "my_database" 

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

如果不指定您重定向到,该文件将在当前工作目录中结束的文件,所以使用pwd目录名是没有必要的。

+0

谢谢。我接受了另一个答案,因为它是第一个,他似乎可以使用比你更多的分数。两者都非常有用。我想可以扩展到也接受'$ 2'和'$ 3'并使用'if'语句来填充变量,如果参数没有给出? – MikeiLL

+1

@MikeiLL是的,你可以在一个函数内做任何你想做的事情。 – Kusalananda

+0

似乎'〜/ .bashrc'可能会比较冗长。人们通常会做什么,如果他们想要加载不同的功能集合,别名用于不同的工作流程? – MikeiLL