通过连接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'
但我仍然在码头上闲逛。有人会如此好心引导我吗?
一个好的解决方案是使用一个函数(而不是别名)。
为什么? 因为别名只能用于简单的修改(如向命令添加额外的参数/标志)。
因此,我们可以创建一个函数或一个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
目录名是没有必要的。
谢谢。我接受了另一个答案,因为它是第一个,他似乎可以使用比你更多的分数。两者都非常有用。我想可以扩展到也接受'$ 2'和'$ 3'并使用'if'语句来填充变量,如果参数没有给出? – MikeiLL
@MikeiLL是的,你可以在一个函数内做任何你想做的事情。 – Kusalananda
似乎'〜/ .bashrc'可能会比较冗长。人们通常会做什么,如果他们想要加载不同的功能集合,别名用于不同的工作流程? – MikeiLL
是否必须使用别名?也可以通过创建一个函数来实现。 –
你的意思是像一个bash脚本,然后我可以理论上创建一个别名?我只是想简化流程。 – MikeiLL
'> $(pwd)/ backup.sql'与'> ./ backup.sql'相同,它与'> backup.sql'相同。我没有看到您关于备份位置的问题。 – Kusalananda