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


20

我々は持っている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)と同じインターフェースを持たない次のソリューションを考えることができます。

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キーを使用できます)。


6
なぜcd /new/cwd && env VAR=value myProgramあなたの基準に合わないのですか?
jpaugh

それはすでに問題になっています。M。Piotrowskiは、それがと同じインターフェースではないと説明しましたenv。見てくださいenv。比較しrtprioidprionumactljexecchrt、との回答で述べたツールセットで実際にコマンド。パターンがあり、それはチェーンローディングです。
JdeBP

3
「インターフェース」とはどういう意味ですか?そして、なぜ使用しないの(cd the/cwd; cmd)ですか?
コンラッドルドルフ

2
@KonradRudolphたとえば(cd the/cwd; cmd)、sh(1)でラップしない限り、env(1)に簡単に渡すことはできません。
マテウスピオトロ

回答:


19

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

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

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

(ディレクトリがでないと仮定-)。CDPATH=(環境に1つある場合)を追加し-P、それがより直線のように動作するようにしchdir()ます。

あるいは、誰が箱から出してすぐに使用perlすることもできます。chdir()chdir()

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

そうそう。これは、質問に含めたスクリプトの非常に便利なバリエーションを示しています。私が探しているユーティリティは、その機能が比較的短いsh(1)ワンライナーですでに利用可能であるため、存在しないのではないかと心配しました。
マテウスピオトロ

8
すでに実行している場合はsh、実行することもできます(cd /wherever && exec /my/command)()暗黙的に包まれたコマンドを実行するためにサブシェルを開き、そしてもちろん、exec迅速ほどの余分なシェルプロセスを取り除く/my/command開始が実行されています。
jpaugh

2
これは、削除された回答で提案されました。質問者は、それがxeの質問に対する答えではないと説明した。
JdeBP

15

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

  • ウェインマーシャルのperpはruntool次のとおりです。

    runtool -c / new / cwd myProgram
  • Laurent Bercotのexeclineには以下がありcdます

    cd / new / cwd myProgram
  • 私のnoshツールセットにchdir次のものがあります:

    chdir / new / cwd myProgram

これらはすべてチェーン読み込みツールであり、まさにこの種のチェーンで使用されるように設計されています。これらのツールキットには、他の目的のためのチェーンロードツールの幅広い選択肢があります。

参考文献

  • /unix//a/353698/5132
  • ローラン・ベルコット(2018-08-01)。"参照"。execline。skarnet.org。
  • ローラン・ベルコット(2018-11-08)。"参照"。S6。skarnet.org。
  • ジョナサン・ド・ボイン・ポラード(2018)。「コマンドとツールのリスト」。 間食ガイド。ソフトウェア。

11

そのような人気のあるプログラムがあります。それはあなたの椅子...ドラムロール上に...ホールドと呼ばれます... env。POSIXではなく、バージョン8.28以降のGNUバージョンには、必要に応じ-Cてディレクトリを設定できるオプションがあります。

    
           env-変更された環境でプログラムを実行する

    あらすじ
           env [オプション] ... [-] [名前=値] ... [コマンド[ARG] ...]

    説明
           環境内の各NAMEをVALUEに設定し、COMMANDを実行します。

           長いオプションの必須引数は、短いオプションにも必須です。

           -i、-- ignore-environment
                  空の環境から始めます

           -0-null
                  各出力行を改行ではなくNULで終了します

           -u、-- unset = NAME
                  環境から変数を削除する

           -C、-- chdir = DIR
                   作業ディレクトリをDIRに変更します

           --helpこのヘルプを表示して終了

           - バージョン
                  バージョン情報を出力して終了する

           単なる-は-iを意味します。コマンドがない場合、結果の環境を印刷します。


クールですが、macOSおよびFreeBSDではすぐに使用できません。
マテウスピオトロ

1

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

-C <path>

現在の作業ディレクトリの代わりgitに起動されたかのように実行します<path>

そして、作ります:

-C dir--directory=dir

dirメイクファイルを読み取るか、他の操作を行う前にディレクトリに移動します。

とタール:

-C--directory=DIR

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


はい。私の質問はmyProgram、そのようなオプションを提供しない場合です...あなたの貢献に感謝しますが、私はそれが私の質問にまったく答えていないのではないかと思います。
マテウスピオトロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.