現在のディレクトリを変更せずに、フォルダでコマンドを実行するにはどうすればよいですか?


18

奇妙に思えるかもしれませんが、シェルの現在のフォルダーを変更せずに特定のフォルダーでコマンドを実行したいです。例-これは私が通常行うことです:

~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key

私はこのようなものが欲しいけれども:

~$ .folder command --key
~$ another_command --key

出来ますか?


できませんか~/.folder/command --key?んcommandであるためにあなたの現在のディレクトリを必要としますか~/.folder
グレンジャックマン14年

回答:


44

秒を避けたいcd場合は、使用することができます

(cd .folder && command --key)
another_command --key

非常に迅速な回答!システムで許可されていないため、それを受け入れることさえできません))
ティムールFayzrakhmanov 14年

1
魔法の括弧!それはどのように機能しますか?+1
正確な14年

カッコ内のコマンドは新しいシェルプロセスで実行されるため、カッコ内のディレクトリの変更、環境変数の設定などは、他のコマンドを実行する親シェルに影響しません。
フロリアンディーシュ14年

7
メジャー;&&に変更します。CDが失敗した場合(たとえば、ディレクトリ名をタイプミスしたため)、おそらくコマンドを実行したくないでしょう。
ガイラ14年

+1 @geirhaのコメント。それは本当に重要なポイントです。OP、編集を検討しますか?
ジェイビー

8

なしcd...一度も。私は2つの方法を見つけました:

# Save where you are and cd to other dir
pushd .folder
command --key
# Get back where you were at the beginning.
popd
another_command --key

2番目:

find . -maxdepth 1 -type d -name ".folder" -execdir command --key \;
another_command --key

1

特定のディレクトリでコマンドを実行するための単純なbash関数:

# Run a command in specific directory
run_within_dir() {
    target_dir="$1"
    previous_dir=$(pwd)
    shift
    cd $target_dir && "$@"
    cd $previous_dir
}

使用法:

$ cd ~
$ run_within_dir /tmp ls -l  # change into `/tmp` dir before running `ls -al`
$ pwd  # still at home dir

0

これをbashなしの方法で行う必要があり、ユーティリティ(変更された作業ディレクトリでコマンドを実行するのと同じ、env(1)またはsudo(1)それを実行するもの)がないことに驚いたので、それを行う簡単なCプログラムを作成しました。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char ENV_PATH[8192] = "PWD=";

int main(int argc, char** argv) {
    if(argc < 3) {
        fprintf(stderr, "Usage: in <dir> <cmd> [<args>...]\n");
        return 1;
    }

    if(chdir(argv[1])) {
        fprintf(stderr, "Error setting working directory to \"%s\"\n", argv[1]);
        return 2;
    }

    if(!getcwd(ENV_PATH + 4, 8192-4)) {
        fprintf(stderr, "Error getting the full path to the working directory \"%s\"\n", argv[1]);
        return 3;
    }

    if(putenv(ENV_PATH)) {
        fprintf(stderr, "Error setting the environment variable \"%s\"\n", ENV_PATH);
        return 4;
    }

    execvp(argv[2], argv+2);
}

使用方法は次のとおりです。

$ in /path/to/directory command --key
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.