web-dev-qa-db-ja.com

プログラムを呼び出すときに現在の作業ディレクトリを設定するPOSIX(または少なくとも一般的な)ユーティリティはありますか?

env(1) を実行して、実行するコマンドの環境を変更します(例:env MANPAGER=more man dtrace)。同様のものはありますが、コマンドが開始されるディレクトリを変更するためのものですか?

理想的には、次のようにします。

theMagicCommand /new/cwd myProgram

このようにして、他のenv(1)のようなコマンドと「連鎖」させることができます。

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

これまでのところ、残念ながらenv(1)と同じinterfaceを持っていない次の解決策を考えることができます。

cd /new/cwd && myProgram

また、次のような単純なシェルスクリプトを作成することもできます。

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

しかし、私はすでに存在するものを探しています(少なくともmacOSとFreeBSDで)。

myProgramは必ずしもデスクトップアプリケーションではありません(この場合、.desktopファイルで Pathキーを使用できます) )。

21

私の知る限り、POSIXツールチェストにはそのような専用のユーティリティはありません。ただし、shスクリプトで行うようにコマンドを実行する前に、shを呼び出して環境(cwd、limits、stdout/in/err、umask ...)をセットアップするのが一般的です。

ただし、スクリプトをファイルに記述する必要はありません。インライン化するだけです。

_sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
_

(ディレクトリが_-_ではないと想定)。 _CDPATH=_(環境に存在する場合)と_-P_を追加して、ストレートchdir()のように動作させます。

代わりに、Perlを使用することもできます。そのchdir()は、そのままchdir()を実行します。

_Perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
_
19

Daemontoolsの世界や他の場所で使用されているツールセットには、これ以外にもさまざまなものがあります。長年持ってきました;そして広く利用可能です。

  • ウェインマーシャルのperpは runtool
    runtool -c/new/cwd myProgram
  • Laurent Bercotのエグゼクティブラインには cd :があります。
    cd/new/cwd myProgram
  • my nosh toolset has chdir
    chdir/new/cwd myProgram

これらはすべて、チェーンローディングツールであり、まさにこの種のチェーンで使用されるように設計されています。これらのツールキットには、他の目的のためのさまざまなチェーンロードツールがあります。

参考文献

15
JdeBP

そんな人気番組があります。それは...椅子につかまって...ドラムロール... envと呼ばれています。 GNUバージョン、バージョン8.28以降、POSIXではなく、-Cオプションを使用すると、必要に応じてディレクトリを設定できます。

名前
 env-変更された環境でプログラムを実行します
 
 あらすじ
 env [オプション] ... [-] [名前=値] ... [コマンド[ARG] ...] 
 
 説明
環境で各NAMEをVALUEに設定し、COMMANDを実行します。
 
長いオプションへの必須の引数は、短いオプションでも必須です。 -私、 --ignore-environment
空の環境で開始します
 
 -0、  - ヌル
各出力行を改行ではなくNULで終了します
 
 -u、 -未設定= NAME 
環境から変数を削除します
 
 -C、 --chdir= DIR 
 作業ディレクトリをDIRに変更します - 助けて このヘルプを表示して終了します
 
  - バージョン
バージョン情報を出力して終了する
 
単なる-意味する -私。コマンドがない場合は、結果の環境を印刷します。
 
11

Gitのような特定のプログラムには、このオプションがあります。

-C <path>

gitが現在の作業ディレクトリではなく<path>で起動されたかのように実行します。

そして、作ります:

-C dir--directory=dir

Makefileを読み取る前、または何かを行う前に、ディレクトリdirに移動します。

そしてタール:

-C--directory=DIR

操作を実行する前にDIRに変更してください。このオプションは順序に依存します。つまり、後続のすべてのオプションに影響します。

1
Steven Penny