프로그램을 호출 할 때 현재 작업 디렉토리를 설정하는 POSIX (또는 최소한 인기있는) 유틸리티가 있습니까?


20

우리는이 ENV (1) 우리가 (예를 들어 실행할 명령의 환경을 수정할 수를 env MANPAGER=more man dtrace). 명령이 시작될 디렉토리를 수정하기위한 비슷한 것이 있습니까?

이상적으로는 다음과 같이 표시하고 싶습니다.

theMagicCommand /new/cwd myProgram

이런 식으로 다른 env (1)와 같은 명령과 "체인"될 수 있습니다.

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

지금까지 불행히도 env (1) 과 동일한 인터페이스 가없는 다음 솔루션을 생각할 수 있습니다 .

cd /new/cwd && myProgram

또한 다음과 같은 간단한 쉘 스크립트를 만들 수 있습니다.

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

그러나 나는 이미 존재하는 것을 찾고 있습니다 (적어도 macOS 및 FreeBSD에서).

myProgram반드시 데스크톱 응용 프로그램은 아닙니다 (이 경우 .desktop 파일에서 Path 키를 사용할 수 있음 ).


6
왜 cd /new/cwd && env VAR=value myProgram당신의 기준을 충족시키지 않습니까?
— jpaugh

M. Piotrowski가 설명과 같은 인터페이스가 아니라고 이미 설명하고 env있습니다. 을보십시오 env. 이에 비교 rtprio, idprio, numactl, jexec, chrt의 도구 세트에서 실제로 명령이 답변에서 언급했다. 패턴이 있으며 체인 로딩입니다.
— JdeBP

3
"인터페이스"는 무슨 뜻입니까? 왜 사용하지 (cd the/cwd; cmd)않습니까?
— Konrad Rudolph

2
@KonradRudolph 예를 들어, (cd the/cwd; cmd)sh (1)로 감싸지 않고 env (1)에 쉽게 전달할 수 없습니다 .
— Mateusz Piotrowski 20

답변:


19

AFAIK, POSIX 도구 상자에는 이러한 전용 유틸리티가 없습니다. 그러나 스크립트 sh에서 명령을 실행하기 전에 환경 (cwd, limit, stdout / in / err, umask ...)을 설정하는 것이 일반적 sh입니다.

그러나 스크립트를 파일로 작성할 필요는 없으며 인라인 할 수 있습니다.

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(디렉토리가 아닌 것으로 가정 -). CDPATH=(환경에 하나가있는 경우) 추가 하고 -P더 직선처럼 행동합니다 chdir().

또는 상자 에서 바로 사용 perl하는 사람을 사용할 수 있습니다 .chdir()chdir()

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

오 예. 이것은 내 질문에 포함 된 스크립트의 매우 편리한 변형입니다. 나는 찾고있는 유틸리티가 상대적으로 짧은 sh (1) oneliner로 이미 사용 가능하기 때문에 존재하지 않을까 두려워했습니다.
— Mateusz Piotrowski

8
이미 실행중인 경우 sh수행 할 수도 있습니다 (cd /wherever && exec /my/command). 는 ()암시 적으로 감싸 명령을 실행하기 위해 서브 쉘을 열고, 물론, exec신속만큼 여분의 쉘 프로세스를 제거한다 /my/command시작 실행.
— jpaugh

2
그것은 지금 삭제 된 답변에서 제안되었습니다. 질문자는 xe가 요청한 것에 대한 답변이 아니라고 설명했습니다.
— JdeBP

15

daemontools 세계 및 다른 곳에서 사용되는 도구 세트에는 그 외에도 여러 가지가 있습니다. 몇 년 동안 있었다; 널리 이용 가능합니다.

  • Wayne Marshall의 perp는 runtool다음과 같습니다.

    runtool -c / new / cwd myProgram
  • Laurent Bercot의 임원은 cd다음과 같습니다.

    cd / new / cwd myProgram
  • 내 nosh 툴셋 은 chdir다음과 같습니다.

    chdir / new / cwd myProgram

이 모든 것은 체인 로딩 툴이며, 정확히 이런 종류의 체인에 사용되도록 설계되었습니다. 이 툴킷에는 다른 목적으로 다양한 체인 로딩 툴이 있습니다.

추가 자료


11

그런 인기있는 프로그램이 있습니다. 그것은이라고합니다 ... 대기 의자에 ... 드럼 롤 ... env. POSIX가 아닌 버전 8.28 이후의 GNU 버전 -C에는 필요한대로 디렉토리를 설정할 수 있는 옵션이 있습니다.

    이름
           env-수정 된 환경에서 프로그램을 실행

    개요
           env [OPTION] ... [-] [NAME = VALUE] ... [COMMAND [ARG] ...]

    기술
           환경에서 각 NAME을 VALUE로 설정하고 명령을 실행하십시오.

           긴 옵션에 대한 필수 인수는 짧은 옵션에도 필수입니다.

           -i ,- 무시 환경
                  빈 환경에서 시작

           -0 , --null
                  줄 바꿈이 아닌 NUL로 각 출력 줄을 끝내십시오.

           -u , --unset = NAME
                  환경에서 변수를 제거

           -C , --chdir = DIR
                   작업 디렉토리를 DIR로 변경

           --help 이 도움말을 표시하고 종료

           --번역
                  버전 정보를 출력하고 종료

           단지 -i를 의미합니다 . 명령이 없으면 결과 환경을 인쇄하십시오.


macOS 및 FreeBSD에서 기본적으로 제공되지는 않지만 쿨합니다.
— Mateusz Piotrowski

1

특정 프로그램에는 Git과 같은 옵션이 있습니다.

-C <path>

현재 작업 디렉토리 대신 git시작된 것처럼 실행하십시오 <path>.

그리고 확인 :

-C dir, --directory=dir

dir메이크 파일을 읽거나 다른 작업을하기 전에 디렉토리로 변경하십시오 .

그리고 타르 :

-C, --directory=DIR

DIR작업을 수행 하기 전에로 변경하십시오 . 이 옵션은 순서에 따라 다릅니다. 즉, 다음에 오는 모든 옵션에 영향을줍니다.


예. 내 질문은 myProgram그런 옵션을 제공하지 않으면 무엇입니까 ... 귀하의 기여에 감사드립니다.하지만 내 질문에 전혀 대답하지 못합니다.
— Mateusz Piotrowski 20시 43 분
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.