프로그램을 호출 할 때 현재 작업 디렉토리를 설정하는 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.