別の作業ディレクトリを使用してコマンドを実行するにはどうすればよいですか?

別の作業ディレクトリを使用してコマンドを実行するにはどうすればよいですか?

このシェルパイプを使用して、端末を介して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の答えのように)。ただし、コマンドを処理する場合する特定の作業ディレクトリが必要な場合は、簡単に作成できるように注意する必要があるいくつかの点があります。

まず、変数がcdsetなので、OLDPWD名前がわからない場合でも、それを使用して元のディレクトリに戻ることができます。次に、コマンドが成功したかどうかを返したいので、;代わりに使用してください&&

cd "$workdir" && somecommand ; cd "$OLDPWD"

最初が失敗してもcdより強くなることは依然として信頼できません。

if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi

somecommandこの時点でも、その後にシャットダウン状態が必要な場合は困難になります。


通常、サブシェルでコマンドを実行し、サブシェルの作業ディレクトリのみを変更するのが最善です。

( cd "$workdir" && somecommand )

最後の方法は、後続のコマンドの変数設定など、サブシェルで実行できない操作を行わない限り、通常使用して推奨する方法です。

関連情報