如何使用不同的工作目录运行命令?

如何使用不同的工作目录运行命令?

我使用这个 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 中无法完成的操作,例如为后续命令设置变量。

相关内容