ディレクトリにCDを挿入せずに、特定のディレクトリから特定のコマンドを実行しますか?

ディレクトリにCDを挿入せずに、特定のディレクトリから特定のコマンドを実行しますか?

コマンドを実行せずに他のディレクトリからコマンドを実行する方法はありますかcd?単にcd入って来ることができることを知っていますが、追加cdのステップを放棄する可能性にのみ興味があります。 :)

答え1

これが重要かどうかはわかりませんが、サブシェルを作成できます。

$ (cd /var/log && cp -- *.log ~/Desktop)

cd -ディレクトリはそのサブシェルに対してのみ変更されるため、後で実行する必要がある作業を回避できます。

答え2

他の人が提供する答えの価値を損なうことなく、欲しいものを信じます。これは:

(cd /path/to && ./executable [ARGS])

cdサブシェル内で呼び出されるかっこに注意してください。

答え3

一部のプログラムには、ユーザーに通知するオプションがあります。目次(2)自体(例:GNUアスファルト-C/ --directory)。

ただし、これらの計画に加えて、いくつかの措置を講じる必要があります。目次。シェルを実行するのではなく、コンパイル済みの「バイナリ」プログラムの種類を書いて使用することはできますが、おそらくあまり良い結果が得られません。

他の回答へのコメントで、次の例を紹介しました。

execindirectory -d /var/log "cp *.log ~/Desktop"

*.logスキーマはシェル自体によって拡張されるので(CP)、いくつかの点は次のとおりです。目次シェルにコマンドを評価させる前に、このディレクトリに移動してください。

「cd back」を回避するには、サブシェルを使用して分離できます。CD作業中のシェルインスタンスで。

(cd /path/to/dir && some command)

これをシェル関数でラップできます。 (-dディレクトリが実際にオプションである場合、このコマンドはほとんど意味がないため、例の使用からそのオプションを削除しました。)

runindir() { (cd -- "$1" && shift && eval " $@"); }

runindir /var/log 'cp -- *.log ~/Desktop'  # your example
runindir /var/log cp -- \*.log \~/Desktop  # eval takes multiple args
                                           # which it concatenates
                                           # with spaces prior to
                                           # evaluation
runindir /var/log cp -- \*.log ~/Desktop      # 例いいえチルダを最初に拡張できます。
                                           #拡張結果は
                                           #シェルコードとして解釈されます
                                           #$ HOMEに次のものが含まれていると壊れます。
                                           #シェル固有の文字。

答え4

cd質問の目的のように見えることをすることを忘れないでください。 (Bashを使用して)元の位置に戻る方法は次のとおりです。

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(編集:@Random832のおかげで少し短縮されたバージョン)

関連情報