Linuxシェルから、現在とは異なる作業ディレクトリでプログラムを実行するにはどうすればよいですか?


352

Linuxシェルを使用して、現在の作業ディレクトリとは異なる作業ディレクトリでプログラムを起動するにはどうすればよいですか?

たとえば、現在のディレクトリにファイルhelloworldを作成するバイナリファイルがあります。 このファイルはディレクトリ内にあります。hello-world.txt

/a

現在、私はディレクトリにい/bます。私は私のプログラムの実行を開始したい../a/helloworldとget hello-world.txt三ディレクトリ内のどこかを/c


5
コマンドをsu実行する前に、作業ディレクトリを指定したユーザーのホームディレクトリにリセットする難しい方法を発見しました-c。これはとても役に立ちました。
Patrick M

回答:


561

次のようにプログラムを呼び出します。

(cd /c; /a/helloworld)

括弧により、サブシェルが生成されます。次に、このサブシェルは作業ディレクトリをに変更してから/c、から実行helloworld/aます。プログラムが終了すると、サブシェルが終了し、開始したディレクトリの親シェルのプロンプトに戻ります。

エラー処理:スペルを間違えた場合など、ディレクトリを変更せずにプログラムを実行しない/cようにするには、helloworld条件付きで実行します。

(cd /c && /a/helloworld)

メモリ使用量の削減: hello worldの実行中にサブシェルがメモリを浪費しないようにするには、helloworldexecを介して呼び出します。

(cd /c && exec /a/helloworld)

[ この回答を改善するためのヒントを提供してくれたJoshとJulianoに感謝します!]


1
このシェルに引数を渡す方法はありますか?$ 1と$ 2のように?
有限ループ、

2
@segfault:サブシェルは周囲のスコープに完全にアクセスできます。
デビッドシュミット、

とにかく一時的にそのディレクトリにあるようですね。
dhein

1
$ *、$ @、または "$ @"を実行すると、すべての引数を渡すことができます(引数に二重引用符を尊重させる場合)
Marcel Valdez Orozco

1
この行を/etc/rc.d/rc.localに追加すると機能しますか?
Pratik Patil


25

サブシェルを必要とせず、bashに組み込まれているオプション

(pushd SOME_PATH && run_stuff; popd)

デモ:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

1
同様の提案がSahilによって下で行われました。コマンドが失敗した場合は機能しません。考慮してくださいpushd SOME_PATH && run_stuff && popd。run_stuffが失敗した場合、popdは実行されません。
アントンダネイコ2015

それはbashファイルの設定に依存します。Bashは、(&&を使用するのとは異なり)コマンドが失敗した後でもコマンドの実行を継続できますset -eが、ファイルでそのように使用しないように設定すると、失敗しpopdます。
ローレン

8
それでも、pushd "${SOME_PATH}" && run_stuff; popdpushd / popdセマンティクスは、特定のディレクトリに移動してから元のディレクトリに戻るというこの状況向けに特別に設計されているため、現在の回答よりも優れていると思います。
マルセルバルデスオロスコ2016年

エイリアスとして定義されているように機能し、パラメーターを渡す必要がありますか?
DrB 2017

エイリアスの途中でパラメーターを渡すことができないため、一連のコマンドを実行するパラメーターを渡すシェルスクリプトを作成する必要があると思います。それを書くのに助けが必要な場合は、別の質問をして、これを参照してください。シェルスクリプトを入手したら、新しいスクリプトを呼び出すエイリアスを記述できます。
ローレン


11

UNIXツールはフィルターとして作成し、stdinから入力を読み取り、stdoutに出力を書き込む必要があるといつも思っています。可能であれば、helloworldバイナリを変更して、テキストファイルの内容を特定のファイルではなくstdoutに書き込むことができます。そうすれば、シェルを使用してどこにでもファイルを書き込むことができます。

$ cd〜/ b

$〜/ a / helloworld>〜/ c / helloworld.txt


6
正解は+1ですが、答えは周辺の答えにすぎません。
デビッドシュミット

8

最後の「&&」を「;」に変更するだけです コマンドが失敗したか成功したかに関係なく、cdで戻ります。

cd SOME_PATH && run_some_command ; cd -

4

これを行う1つの方法は、ラッパーシェルスクリプトを作成することです。

シェルスクリプトは、現在のディレクトリを/ cに変更してから、/ a / helloworldを実行します。シェルスクリプトが終了すると、現在のディレクトリは/ bに戻ります。

次にbashシェルスクリプトの例を示します。

#!/bin/bash
cd /c
/a/helloworld

2

シンプルにしておいてください

cd SOME_PATH && run_some_command && cd -

最後の「cd」コマンドを使用すると、最後のpwdディレクトリに戻ります。これはすべての* nixシステムで機能するはずです。


あなたは@mezhakaと書いて、それを考慮すべきだった:)
Sahil

1
警告:run_some_command失敗した場合、cd -実行されません。
starbeamrainbowlabs


0

プログラム内でこれを実行したい場合は、次のようにします。

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

彼はCではなくシェルスクリプトでそれをしたいと考えています。また、バイナリファイルをサブプロセスするのは恐ろしい考えです。

-1

現在のディレクトリから、コマンドを実行するスクリプトディレクトリへのフルパスを提供します

/root/server/user/home/bin/script.sh

1
それは作業ディレクトリをまったく変更しません-私はあなたが尋ねられたものとは異なる質問に答えていると思います。
Toby Speight 2017年

あなたが答えた質問に対する答えを見つけるためにここに来ました。ありがとう!lol
kfrncs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.