Bashはどのようにして別のディレクトリコンテキストでコマンドを実行できますか?


94

非常に特定のディレクトリ内から呼び出される一般的なコマンドがあります。このプログラムの/ binにある実行可能ファイルは1つだけであり、現在の作業ディレクトリはそれを正しく実行するために非常に重要です。スクリプトは、スクリプトが実行されているディレクトリ内にあるファイルに影響します。

今、私は1つのディレクトリでいくつかのことを行うカスタムシェルスクリプトも持っていますが、別のディレクトリにあるかのように上記のコマンドを呼び出す必要があります。

シェルスクリプトでこれをどのように行いますか?


回答:


39

この目的のために、ビルトインcd、またはpushdおよびpopdビルトインを使用できます。例えば:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

ビルトインは他のコマンドと同じように使用し、スクリプト内で何度でもディレクトリコンテキストを変更できます。


4
cd -前のディレクトリに戻すためのPOSIXシェルもあります。それは、言った()pushdpopd実際に対話的な使用のために意図されており、(b)は、それはあなたができると仮定することは常に安全ではありませんcdあなたが始めたところ、バック特に(内部的に制限された権限を使用することができ、複雑なサブシステムに表示stackoverflow.com/questions/を10555284 /…)。
geekosaur 2012年

3
サブシェルを使用する方がはるかに優れたソリューションです
josh123a123 2016

スクリプティングについては、サブシェルの方がおそらく良い考えです。しかし、私はについて学ぶことができて本当にうれしいですpopd
connorbode 2017

:ここで記号の意味を説明していただけますか?
Vadim Kotov 2018年

2
@VadimKotov私はそれが事実上ノーオペレーションだと思います。man bash読み取りの関連セクション: : [arguments]影響なし。このコマンドは、引数を展開し、指定されたリダイレクトを実行する以外に何もしません。戻りステータスはゼロです。
ボーイシー

218

cdサブシェルで使用します。この種のサブシェルを使用する簡単な方法は括弧です。

(cd wherever; mycommand ...)

とは言うものの、コマンドに必要な環境がある場合は、それを使用する可能性のあるものに責任を負わせるのではなく、環境自体を実際に保証する必要があります(ウェルのコンテキストで非常に特定の状況で使用される内部コマンドでない限り)発信者が必要な環境を確保する必要があるように、より大きなシステムを定義しました)。通常、これはある種のシェルスクリプトラッパーです。


同じコンテキスト内の複数行コマンドの\後に、それぞれの後に挿入することもでき;ます。
チラミス


20

現在の作業ディレクトリに戻りたい場合:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. 私たちはcurrent_dirあなたと等しい変数を設定していますpwd
  2. その後cd、コマンドを実行する必要がある場所に移動します
  3. 次に、コマンドを実行しています
  4. 次にcd、変数に戻りますcurrent_dir

@apieceofbartによる別の解決策 pushd && YOUR COMMAND && popd


4
またはあなたが行うことができますpushd && YOUR COMMAND && pulld
apieceofbart

4
@apieceofbartのpopd代わりに意味したと思いますpulld
コンスタンチン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.