このシェルパイプを使用して、端末を介して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
setなので、OLDPWD
名前がわからない場合でも、それを使用して元のディレクトリに戻ることができます。次に、コマンドが成功したかどうかを返したいので、;
代わりに使用してください&&
。
cd "$workdir" && somecommand ; cd "$OLDPWD"
最初が失敗してもcd
より強くなることは依然として信頼できません。
if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi
somecommand
この時点でも、その後にシャットダウン状態が必要な場合は困難になります。
通常、サブシェルでコマンドを実行し、サブシェルの作業ディレクトリのみを変更するのが最善です。
( cd "$workdir" && somecommand )
最後の方法は、後続のコマンドの変数設定など、サブシェルで実行できない操作を行わない限り、通常使用して推奨する方法です。