404

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

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

/a

現在、私はディレクトリにい/bます。プログラムの実行を開始し、3 番目のディレクトリのどこか../a/helloworldを取得したいと考えています。hello-world.txt/c

4

11 に答える 11

637

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

(cd /c; /a/helloworld)

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

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

(cd /c && /a/helloworld)

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

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

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

于 2009-04-24T15:46:04.983 に答える
110

David Schmittの回答と Josh の提案に似ていますが、シェルプロセスを実行したままにしません。

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

この方法は、通常シェルでコマンドを実行する方法に似ています。ps ef実際の違いを確認するには、ソリューションごとに別のシェルから実行する必要があります。

于 2009-04-24T16:05:06.733 に答える
34

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

(pushd SOME_PATH && run_stuff; popd)

デモ:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
于 2015-07-13T19:28:35.250 に答える
20
sh -c 'cd /c && ../a/helloworld'
于 2009-04-24T15:49:37.550 に答える
10

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

$ cd ~/b

$ ~/a/helloworld > ~/c/helloworld.txt
于 2009-04-24T17:15:27.123 に答える
4

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

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

以下は、bash シェル スクリプトの例です。

#!/bin/bash
cd /c
/a/helloworld
于 2009-04-24T15:46:04.967 に答える
2

常に /C に移動する場合は、ファイルを書き込むときに絶対パスを使用します。

于 2009-04-24T15:40:18.337 に答える
-1

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

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

  // rest of your program...

}
于 2009-04-24T16:16:50.183 に答える