Як я можу запустити команду в папці, не змінюючи в ній свого поточного каталогу?


18

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

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

Хоча я хочу щось подібне:

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

Це можливо?


Ти не можеш ~/.folder/command --key? Чи commandпотрібен ваш поточний каталог ~/.folder?
glenn jackman

Відповіді:


46

Якщо ви хочете уникнути другого cd, можете скористатися

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

Дуже швидка відповідь! Я навіть не можу прийняти це, бо система мені не дозволяє))
Тимур Файзрахманов

1
магічні дужки! як це працює? +1
точно

Команди в круглих дужках виконуються в новому процесі оболонки, тому зміна каталогу, встановлення змінних оточуючих середовищ тощо всередині дужки не впливають на батьківську оболонку, яка виконує інші команди.
Флоріан Дієш

9
Я б змінив на ;на &&добру міру. Якщо CD не виходить (наприклад, тому, що ви ввели ім'я каталогу), ви, ймовірно, не хочете запускати команду.
geirha

+1 для коментаря @ geirha. Це дійсно важливий момент. ОП, ви б розглянути можливість редагування?
jaybee

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

У мене виникла потреба зробити це безрезультатно, і я був здивований, що утиліти (подібної 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.