bash의 다른 디렉토리에서 명령 실행


119

내가 이것을하고 있다고 말하십시오.

cd subdir
git init
cd ../

명령을 실행하기 위해 디렉토리 안팎으로 이동하지 않고 단일 명령 또는이 명령을 사용하여이 작업을 수행하는 방법이 있습니까?

(git-specific 솔루션을 찾지 않고 단지 예일뿐입니다.)

답변:


202

이것은 종종 가장 좋은 방법입니다.

( cd dir ; git init )

또는

( cd dir && git init )

꽤 짧고 입력하기 쉽습니다. 하위 셸을 시작하므로 환경을 수정할 수 없지만 여기서는 문제가되지 않습니다.


1
그리고 환경 변수를 설정해야 할 경우 처음에 다른 명령으로 추가하십시오.
Hippo

1
@CraigMcQueen : 실제로는 아닙니다. $?서브 쉘에서 실행 된 마지막 명령의 종료 코드가 포함됩니다. &&변형 을 사용하는 경우 (보통해야 함) 실패한 첫 번째 명령의 종료 코드를 얻습니다 (또는 모두 정상적으로 진행되면 0).
Mat

괄호는 선택 사항 인 것 같습니다
Francis.Beauchamp

10
@ Francis.Beauchamp : Parens를 생략하면 시작한 위치가 아닌 명령 후에 하위 디렉토리에있게됩니다.
Mat

Windows에서 어떻게합니까?
Karl Morrison

22

경로에서 git 명령을 실행하고 다른 경로에서 저장소를 변경하는 방법을 찾고있었습니다. 그래서 나는이 질문에서 끝났습니다.

그러나 내 특정 요구에 대해서는 허용 된 답변이나 다른 답변 중 어느 것도 도움이되지 않았습니다.

나는 sudo -u USER /usr/bin/git(다른 사용자가 그것을 사용하여) git 명령을 실행해야했다. 아시다시피 sudo는 cd명령 을 실행할 수 없으므로 저장소 디렉토리에 있을 수 없습니다 .

그래서 나는 git 's man page에 갔다 . 그리고 옵션들 중에서 나는 --git-dir=<path>:

--git-dir =

저장소 경로를 설정하십시오. GIT_DIR 환경 변수를 설정하여 제어 할 수도 있습니다. 현재 작업 디렉토리에 대한 절대 경로 또는 상대 경로 일 수 있습니다.

따라서 누군가에게 도움이 되더라도 경로에서 git을 사용하고 "먼 곳에서"저장소를 변경할 수 있습니다. 그냥 사용하십시오 :

git --git-dir=/path/to/repository GIT_COMMAND

또는 다른 사용자로 실행하려면 다음과 같이하십시오.

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND

또한 git-init 매뉴얼 페이지에서 :

$ GIT_DIR 환경 변수가 설정되면 리포지토리의 기본에 ./.git 대신 사용할 경로를 지정합니다.

따라서 일반적인 .git 폴더 아래에 리포지토리를 초기화하려면 --git-dir옵션 과 함께 지정해야합니다 . 예 :

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init

on on 저장소를 초기화 한 후 git 's man page에 설명 된대로 /path/to/repo/.git모든 추가 명령에는 옵션이 있어야합니다 --work-tree=<path>.

--work-tree =

작업 트리의 경로를 설정하십시오. 절대 경로이거나 현재 작업 디렉토리에 상대적인 경로 일 수 있습니다. 이것은 또한 GIT_WORK_TREE 환경 변수 및 core.worktree 구성 변수를 설정하여 제어 할 수 있습니다 (자세한 설명은 git-config (1)의 core.worktree 참조).

따라서 다른 사용자로 git을 실행하고 새 저장소를 초기화하는 올바른 명령은 다음과 같습니다.

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master

스크립트를 사용하지 않고 대화식으로 sudo를 사용 하는 경우 대화식 루트 셸을 사용 sudo -i하거나 sudo su얻을 수 있습니다.
Bugster

( cd subdir && sudo -u USER /usr/bin/git init )작동하지 않을지 상상할 수 없습니다 .
스콧

액세스 권한이 없으면 subdir어떻게합니까?
dmmd

13

아니 정확히 당신이 (당신이 서브 쉘로 위의 실제 답변을) 요청 만보고있어 pushdpopd


나는 maven을 위해 cd &&로 시도했지만 작동하지 않았지만 밀고 터져서 완벽하게 작동합니다. 감사합니다
Radu Toader 2016 년

6

몇 가지 옵션이 있습니다. &&또는로 명령을 그룹화 할 수 있습니다 ;. 이처럼 :

cd subdir && git init && cd ..

또는

cd subdir; git init; cd ..

차이점은 첫 번째 예에서 명령 중 하나가 실패하면 나머지 명령은 실행하지 않는다는 것입니다. 두 번째 예에서는 모든 명령이 무엇이든 실행됩니다.

다른 옵션은 함수를 정의하고 사용하는 것입니다. 예를 들면 다음과 같습니다.

function cdinit() {
    cd $1
    git init
    cd ..
}

그런 다음 명령을 실행할 수 있습니다.

cdinit subdir

그리고 자동 git init으로 해당 디렉토리에 들어가서 빠져 나옵니다.

많은 디렉토리가 있고 git init하나의 명령 으로 디렉토리를 원할 경우 함수를 사용하여보다 복잡한 솔루션을 수행 할 수도 있습니다 .

function cdinit() {
    for arg in $@
    do
        cd $arg
        git init
        cd ..
    done
}

그런 다음 다음을 사용하여 실행할 수 있습니다.

cdinit subdir1 subdir2 subdir3

그리고 그것은 할 것입니다 git initsubdir1, subdir2그리고 subdir3.


감사. 나는 알고 있었다 &&하고 ;, 그러나 더 우아한 뭔가를 희망했다. 스크립트를 작성하는 것이 가장 좋습니다.
Trevor Burnham

정정 :이 답변은 괜찮지 만 Mat의 답변은 내 특정 요구에 더 좋습니다.
트레버 번햄

cdinit임의의 명령에 대해 함수를 일반화 할 수 있다고 생각하십니까 ? 나는 인수를 사용하려고 시도했지만 작동하지 않았습니다.
Chetan Bhasin

(1) 줄 바꿈은와 동일 ;하므로 세 줄 함수는와 같습니다 cd $1; git init; cd ... (2) 당신은 당신의 변수를 인용한다 : "$1", "$@""$arg". 또는 당신은 생략 할 수 있습니다 for arg in "$@"for arg.
스콧

5

의 경우 git(적어도 버전 2.7.0에서), 당신이 활용할 수있는 -C가 주어진 디렉토리에서 시작 것처럼 자식 동작합니다을 만드는 옵션을 선택합니다. 따라서 솔루션은 다음과 같습니다.

> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/

문서 인용하기 :

Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.

This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option. 

2

&&로 명령을 그룹화 할 수 있습니다.

cd subdir && git init && cd ../

각 명령의 종료 코드에 의존하지 않으려면; 대신, 즉 :

cd subdir ; git init ; cd ../

1
또는 ;이전 코드의 리턴 코드에 의존하지 않도록하십시오.
slhck

(1)  cd subdir && git init ; cd ..실제로 가장 의미가있을 수 있습니다. 사용자가에서 git init명령 subdir을 실행하려면 현재 디렉토리에서 명령을 실행하지 않을 것입니다. 즉, 그들은 (첫 번째) cd실패하면 실행하고 싶지 않습니다. ( cd우리가 이미 에 있기 때문에 실패가 가능할 수도 있지만 그것은  subdir모퉁이의 경우입니다.) ... (계속)
Scott

(계속)… 그러나 사용자가 세 명령의 블록을 한 단위로 취급하려는 cd경우 git init명령이 실패 하더라도 시작 디렉토리 로 백업 할 수 있습니다  . ( 또는 그들이 하위 디렉토리에 머물면서 명령 실패를 진단 할 수 있습니다.) (2) 당신은 포함 할 필요가 없습니다 /후를  ...
스콧

2

명령에 파일 이름 또는 디렉토리 이름 매개 변수가없는 경우 대상 디렉토리로 홉해야합니다.

그러나 대상 디렉토리와 명령을 매개 변수로 사용하는 bash 스크립트를 작성할 수 있습니다. 이를 위해 푸시 및 팝을 볼 수 있습니다 : http://ss64.com/bash/pushd.html

나는 당신을 위해 그 작은 스크립트를 쓸 것이지만, 나는 여기에 리눅스 박스가 없다 :)


Mark Szymanski의 답변을 보았습니다. 명령에 대한 두 번째 매개 변수를 구현하고 명령의 이름을 바꿀 수 있으며 원하는 것을 가질 수 있습니다.
wullxz

1

프로그램은 인수를 처리하는 방법이 다르므로 일부는 -folder = name 옵션 과 동일 합니다. 그 예외 외에도 MS DOS에서도 표준은 간단합니다.

$ 프로그램 하위 디렉토리

때때로 당신은 필요

$ 프로그램 하위 디렉토리 /

프로그램은 폴더를 열고 파일 작업과 같은 방식으로 작업하며, 완료되면 원래 표준 디렉토리를 가리키는 셸로 제어를 되돌립니다. 이러한 방식으로 처리 된 프로그램에는 코어 덤프와 같은 오류 출력이 subdir 대신 쉘의 현재 디렉토리에있는 파일로 이동하는 문제가 있습니다.

프로그램에 다른 장소를 지정하는 데 사용할 수있는 명령 스위치가 없으면 해결 방법이 없습니다. 일부 프로그래머는 "디렉토리 프로그램이에서 호출되었습니다 "와 "디렉토리 프로그램이 에서 작동하도록 지시되었습니다 " 사이에서 예술적 라이센스 받습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.