我使用这个 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
。
有人可以建议吗?
答案1
老实说,我根本看不出这两个电话有什么理由cd
。
您似乎没有使用您cd
进入的目录进行任何操作。您为数据库转储位置提供绝对路径。如果需要任何自定义 MySQL 配置文件,无论如何都可以从用户的主目录中获取该文件。
因此,你很可能只使用
mysqldump -uroot -p"craft" --add-drop-table craft \
> ~/../docker-entrypoint-initdb.d/base.sql
无论您从哪个目录运行它。
答案2
在这种情况下,您根本不需要更改工作目录(如 Kusalananda 的回答)。但是,如果您正在处理的命令做需要一个特定的工作目录,那么需要了解一些事情,这会让您更轻松。
首先,由于cd
设置了OLDPWD
变量,我们可以使用它返回到原始目录,而不必知道它的名称。其次,我们可能想返回命令是否成功,因此使用;
而不是&&
那里:
cd "$workdir" && somecommand ; cd "$OLDPWD"
如果第一个失败了,那仍然不可靠cd
;为了变得更加强大,我们确实需要
if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi
somecommand
即使在这一点上,如果我们需要此后的退出状态,我们也会遇到困难。
通常最好在子 shell 中运行命令,并仅更改子 shell 的工作目录:
( cd "$workdir" && somecommand )
最后一种方法是我通常使用和推荐的方法,除非您正在执行子 shell 中无法完成的操作,例如为后续命令设置变量。