현재 디렉토리를 변경하지 않고 폴더에서 명령을 실행하려면 어떻게해야합니까?


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

매우 빠른 답변! 시스템이 나를 허용하지 않기 때문에 나는 그것을 받아 들일 수조차 없다))
Timur Fayzrakhmanov

1
마법의 괄호! 어떻게 작동합니까? +1
정확한

괄호 안의 명령은 새 셸 프로세스에서 실행되므로 괄호 안의 디렉토리 변경, 환경 변수 설정 등은 다른 명령을 실행하는 부모 셸에 영향을 미치지 않습니다.
Florian Diesch

9
나는 변경 줄 ;에를 &&좋은 측정을 위해. CD가 실패하면 (예 : 디렉토리 이름을 입력하여) 명령을 실행하고 싶지 않을 수 있습니다.
geirha

@geirha 님의 댓글에 +1 정말 중요한 포인트입니다. OP, 편집을 고려 하시겠습니까?
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

나는 이것을 bash-free 방식으로해야 할 필요가 있었고 수정 된 작업 디렉토리에서 명령을 실행 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.