web-dev-qa-db-ja.com

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

Linuxシェルを使用して、現在の作業ディレクトリとは異なる作業ディレクトリでプログラムを起動する方法を教えてください。

たとえば、現在のディレクトリにファイルhello-world.txtを作成するバイナリファイルhelloworldがあります。このファイルはディレクトリ/aの中にあります。現在私はディレクトリ/bにいます。私のプログラムを../a/helloworldで起動し、hello-world.txtを3番目のディレクトリ/cのどこかに入れたいと思います。

307
Anton Daneyko

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

(cd /c; /a/helloworld)

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

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

(cd /c && /a/helloworld)

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

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

[この答えを改善するためのヒントを与えてくれてありがとう JoshとJuliano !]

498
David Schmitt

David Schmitt の答えにJoshの提案を加えたものに似ていますが、Shellプロセスを実行したままにしないでください。

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

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

88
Juliano
sh -c 'cd /c && ../a/helloworld'
18
mihi

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

(pushd SOME_PATH && run_stuff; popd)

デモ:

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

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

$ cd〜/ b

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

11
Luther Blisset

最後の "&&"を ";"に変更するだけです。そして、コマンドが失敗したか成功したかに関わらず、cdは返されます。

cd SOME_PATH && run_some_command ; cd -
5
johnnybravo

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

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

これがbashシェルスクリプトの例です。

#!/bin/bash
cd /c
/a/helloworld
3
Jin Kim

常に/ Cに移動したい場合は、ファイルを書き込むときに絶対パスを使用してください。

1
Tom Ritter

単純にしない

cd SOME_PATH && run_some_command && cd -

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

1
Sahil

あなたがあなたのプログラムの中でこれを実行したいならば、私は以下のようにするでしょう:

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

  // rest of your program...

}
0
Harold

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

/root/server/user/home/bin/script.sh
0
Ravi Bhushan