Linux 쉘에서 현재와 다른 작업 디렉토리로 프로그램을 어떻게 실행합니까?


351

Linux 쉘을 사용 하여 현재 작업 디렉토리와 다른 작업 디렉토리로 프로그램을 어떻게 시작합니까?

예를 들어 현재 디렉토리 에 파일 helloworld을 만드는 이진 파일 이 있습니다. 이 파일은 directory 안에 있습니다.hello-world.txt

/a

현재 디렉토리에 /b있습니다. 프로그램 실행을 시작 하고 세 번째 디렉토리 어딘가에 ../a/helloworld가져오고 싶습니다 .hello-world.txt/c


5
명령을 su실행하기 전에 작업 디렉토리를 지정한 사용자의 홈 디렉토리로 재설정 하는 어려운 방법을 발견했습니다 -c. 이것은 나에게 매우 도움이되었다.
Patrick M

답변:


560

다음과 같이 프로그램을 호출하십시오.

(cd /c; /a/helloworld)

괄호로 인해 하위 셸이 생성됩니다. 이 하위 쉘은 자사의 작업 디렉토리를 변경 /c한 후 실행, helloworld에서 /a. 프로그램이 종료되면 하위 쉘이 종료되고 시작한 디렉토리의 상위 쉘 프롬프트로 돌아갑니다.

오류 처리가 : 맞춤법이 틀린 한 때 디렉토리를 변경하지 않고 프로그램을 실행 방지하기 위해, 예를 들면 /c, 실행을helloworld 조건부로 .

(cd /c && /a/helloworld)

메모리 사용량 줄이기 : hello world가 실행되는 동안 서브 쉘 메모리 낭비를 피하려면 helloworldexec를 통해 호출하십시오 .

(cd /c && exec /a/helloworld)

[ 이 답변을 개선하는 데 도움을 준 Josh와 Juliano 에게 감사합니다 !]


1
이 쉘에 인수를 전달할 수있는 방법이 있습니까? 1 달러와 2 달러처럼?
finiteloop

2
@segfault : 서브 쉘이 주변 범위에 대한 완전한 액세스 권한을 갖습니다.
David Schmitt

어쨌든 해당 디렉토리에 일시적으로있는 것 같습니다.
dhein

1
당신은 $ @ 또는 $ *를 수행하여 모든 인수를 전달할 수 있습니다 "$ @"(큰 따옴표를 존중 인수를 원하는 경우)
마르셀 발데스 오 로즈 코

1
이 줄을 /etc/rc.d/rc.local에 추가하면 작동합니까?
Pratik Patil


25

서브 쉘이 필요없고 bash에 내장 된 옵션

(pushd SOME_PATH && run_stuff; popd)

데모:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

1
Sahil도 비슷한 제안을했습니다. 명령이 실패하면 작동하지 않습니다. pushd SOME_PATH && run_stuff && popdrun_stuff가 실패하면 popd가 실행되지 않는 것을 고려하십시오 .
Anton Daneyko

늦은 응답. bash 파일의 설정에 따라 다릅니다. Bash는 실패한 명령 이후에도 명령을 계속 실행할 수 있지만 (&&와는 달리) set -e파일에서 사용하지 않도록 설정하면 실패합니다 popd.
Loren

8
pushd "${SOME_PATH}" && run_stuff; popd푸시 / 팝 시맨틱은 특정 디렉토리로 이동 한 다음 원래 디렉토리로 돌아 오는 이러한 상황을 위해 특별히 설계되었으므로 여전히 현재 답변보다 낫습니다.
Marcel Valdez Orozco 1

별칭으로 정의 된대로 작동하며 매개 변수를 전달해야합니까?
DrB

별칭 중간에 매개 변수를 전달할 수 없으므로 일련의 명령을 실행하는 매개 변수를 전달하는 셸 스크립트를 작성해야한다고 생각합니다. 작성하는 데 도움이 필요하면 별도의 질문을하고 이것을 참조해야합니다. 쉘 스크립트가 있으면 새 스크립트를 호출하기 위해 별명을 작성할 수 있습니다.
Loren

19
sh -c 'cd /c && ../a/helloworld'

1
FreeBSD의 jexec에서 지정된 작업 디렉토리의 jail 내부에서 명령을 실행하는 데 사용했습니다.
Marián Černý

11

필자는 항상 UNIX 도구를 필터로 작성하고 stdin에서 입력을 읽고 stdout에 출력을 작성해야한다고 생각합니다. 가능하면 텍스트 파일의 내용을 특정 파일이 아닌 stdout에 쓰도록 helloworld 바이너리를 변경할 수 있습니다. 그렇게하면 쉘을 사용하여 파일을 어디에서나 쓸 수 있습니다.

$ cd ~ / b

$ ~ / a / helloworld> ~ / c / helloworld.txt


6
정답은 말 그대로 답이지만 +1입니다.
David Schmitt

8

마지막 "&&"를 ";"로 변경하십시오. 명령이 실패하거나 성공하더라도 CD가 다시 돌아옵니다.

cd SOME_PATH && run_some_command ; cd -

4

이를 수행하는 한 가지 방법은 랩퍼 쉘 스크립트를 작성하는 것입니다.

쉘 스크립트는 현재 디렉토리를 / c로 변경 한 다음 / a / helloworld를 실행합니다. 쉘 스크립트가 종료되면 현재 디렉토리는 / b로 되돌아갑니다.

bash 쉘 스크립트 예제는 다음과 같습니다.

#!/bin/bash
cd /c
/a/helloworld

2

왜 간단하게 유지하지?

cd SOME_PATH && run_some_command && cd -

마지막 'cd'명령은 마지막 pwd 디렉토리로 돌아갑니다. 이것은 모든 * nix 시스템에서 작동합니다.


당신은 @mezhaka라고 쓰고 있습니다. :)
Sahil

1
경고 : run_some_command실패하면 cd -실행되지 않습니다.
starbeamrainbowlabs

1

항상 / C로 이동하려면 파일을 작성할 때 절대 경로를 사용하십시오.


0

프로그램 내부 에서이 작업을 수행하려면 다음과 같이하십시오.

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

그는 C가 아닌 쉘 스크립트로 그렇게하고 싶어합니다. 또한 바이너리 파일을 하위 처리하는 것은 끔찍한 아이디어입니다.

-1

현재 디렉토리에서 명령을 실행할 스크립트 디렉토리의 전체 경로를 제공하십시오.

/root/server/user/home/bin/script.sh

1
그것은 작업 디렉토리를 전혀 바꾸지 않습니다-나는 당신이 묻는 것과 다른 질문에 대답하고 있다고 생각합니다.
Toby Speight

귀하가 답변 한 질문에 대한 답변을 찾으려면 여기에 오셨습니다. 감사! lol
kfrncs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.