我使用这个 shell 管道通过终端获取 SQL 转储:
$ cd var/lib/mysql && mysqldump -uroot -p"craft" --add-drop-table craft > ~/../docker-entrypoint-initdb.d/base.sql && cd ~/..
可以看出,我进入了var/lib/mysql
目录并将转储创建到一个文件中,然后从最初的位置返回。
该命令是正确的,但是,我想它可以像不直接进入var/lib/mysql
目录一样简洁地编写。
任何人都可以建议吗?
老实说,我根本看不出这两个电话的原因
cd
。您似乎没有将您
cd
进入的目录用于任何事情。您为数据库转储的位置提供绝对路径。如果需要任何自定义 MySQL 配置文件,无论如何都会从用户的主目录中获取。因此,您很可能只使用
无论您从哪个目录运行它。
在这种情况下,您根本不需要更改工作目录(由 Kusalananda 回答)。但是,如果您正在处理确实需要特定工作目录的命令,那么有几件事需要了解,这将使您更容易。
首先,由于
cd
设置了OLDPWD
变量,我们可以使用它返回原始目录,而不必知道它的名称。其次,我们可能想要返回命令是否成功,所以使用;
而不是&&
那里:cd
如果第一个失败,那仍然不可靠;为了更健壮,我们真的需要即使在这一点上,如果我们需要
somecommand
在此之后的退出状态,我们也在苦苦挣扎。通常最好在子 shell 中运行命令,并且只更改子 shell 的工作目录:
最后一种方法是我通常使用和推荐的方法,除非您正在做一些子 shell 无法完成的事情,例如为后续命令设置变量。