回答:
次のようにプログラムを呼び出します。
(cd /c; /a/helloworld)
括弧により、サブシェルが生成されます。次に、このサブシェルは作業ディレクトリをに変更してから/c
、から実行helloworld
し/a
ます。プログラムが終了すると、サブシェルが終了し、開始したディレクトリの親シェルのプロンプトに戻ります。
エラー処理:スペルを間違えた場合など、ディレクトリを変更せずにプログラムを実行しない/c
ようにするには、helloworld
条件付きで実行します。
(cd /c && /a/helloworld)
メモリ使用量の削減: hello worldの実行中にサブシェルがメモリを浪費しないようにするには、helloworld
execを介して呼び出します。
(cd /c && exec /a/helloworld)
[ この回答を改善するためのヒントを提供してくれたJoshとJulianoに感謝します!]
David Schmittの回答とJoshの提案に似ていますが、シェルプロセスを実行したままにしません。
(cd /c && exec /a/helloworld)
この方法は、通常シェルでコマンドを実行する方法に似ています。実際的な違いを確認するには、ps ef
各ソリューションで別のシェルから実行する必要があります。
サブシェルを必要とせず、bashに組み込まれているオプション
(pushd SOME_PATH && run_stuff; popd)
デモ:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
pushd SOME_PATH && run_stuff && popd
。run_stuffが失敗した場合、popdは実行されません。
set -e
が、ファイルでそのように使用しないように設定すると、失敗しpopd
ます。
pushd "${SOME_PATH}" && run_stuff; popd
pushd / popdセマンティクスは、特定のディレクトリに移動してから元のディレクトリに戻るというこの状況向けに特別に設計されているため、現在の回答よりも優れていると思います。
UNIXツールはフィルターとして作成し、stdinから入力を読み取り、stdoutに出力を書き込む必要があるといつも思っています。可能であれば、helloworldバイナリを変更して、テキストファイルの内容を特定のファイルではなくstdoutに書き込むことができます。そうすれば、シェルを使用してどこにでもファイルを書き込むことができます。
$ cd〜/ b
$〜/ a / helloworld>〜/ c / helloworld.txt
シンプルにしておいてください
cd SOME_PATH && run_some_command && cd -
最後の「cd」コマンドを使用すると、最後のpwdディレクトリに戻ります。これはすべての* nixシステムで機能するはずです。
run_some_command
失敗した場合、cd -
実行されません。
現在のディレクトリから、コマンドを実行するスクリプトディレクトリへのフルパスを提供します
/root/server/user/home/bin/script.sh
su
実行する前に、作業ディレクトリを指定したユーザーのホームディレクトリにリセットする難しい方法を発見しました-c
。これはとても役に立ちました。