Как я могу выполнить команду в папке, не меняя мою текущую директорию на нее?

18

Может показаться странным, но я хочу запустить команду в определенной папке, не меняя текущую папку в оболочке. Пример - это то, что я обычно делаю:

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

Хотя я хочу что-то вроде этого:

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

Является ли это возможным?

Тимур Файзрахманов
источник
Вы не можете сделать ~/.folder/command --key? Требуется ли commandваш текущий каталог ~/.folder?
Гленн Джекман

Ответы:

45

Если вы хотите избежать второго, cdвы можете использовать

(cd .folder && command --key)
another_command --key
Флориан Диш
источник
Очень быстрый ответ! Я даже не могу принять это, потому что система не позволяет мне))
Тимур Файзрахманов
1
волшебная скобка! как это работает? +1
точное
Команды в скобках выполняются в новом процессе оболочки, поэтому изменение каталога, установка переменных среды и т. Д. Внутри скобки не влияют на родительскую оболочку, которая выполняет другие команды.
Флориан Диш,
8
Я бы изменить ;To &&для хорошей меры. Если произойдет сбой компакт-диска (например, из-за того, что вы ввели имя каталога), вы, вероятно, не захотите запускать команду.
Гейра
+1 за комментарий @ geirha. Это действительно важный момент. OP, вы бы рассмотрели редактирование?
Джейби
8

Без cd... Ни разу. Я нашел два пути:

# 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

и второе:

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
Lucretiel
источник