래퍼의 현재/작업 디렉터리 문제

래퍼의 현재/작업 디렉터리 문제

내가 직면하는 일반적인 패키징 문제는 도구가 루트 디렉터리(설치 디렉터리)에서 관련 리소스를 찾을 때입니다.

예를 들어. pkg-name( /usr/share/pkg-name/pkg-name)은 ResourceA()를 찾고 있으므로 $PWD =가 아니면 /usr/share/pkg-name/resourceA직접 호출할 수 없습니다. 왜냐하면 다른 곳에 있으면(예를 들어) 도구가 이를 찾아 오류를 발생시키기 때문입니다. 따라서 다음과 같은 래퍼를 만들어야 합니다./usr/share/pkg-name/pkg-name/usr/share/pkg-name//home/user/home/user/resourceA/usr/bin/pkg-wrapper

#!/bin/sh
cd /usr/share/pkg-name
exec pkg-name "\$@"

/usr/bin/pkg-wrapper이제 원하는 만큼 전화를 걸 수 있지만 새로운 문제가 생겼습니다! 스크립트 컨텍스트의 cd /usr/share/pkg-name래퍼에 $PWD=를 추가합니다 . /usr/share/pkg-name따라서 pkg-wrapper -o file파일에 쓸 수 있으면 이제 ( 호출 래퍼의 현재/작업 디렉터리) 대신 (스크립트 컨텍스트 의 현재/작업 디렉터리) 에 pkg-wrapper -o file파일을 저장하려고 시도한다고 상상해 보세요. 이제 파일이 원하는 폴더에 저장되었습니다. 쓰기 금지된 경우 어쨌든 권한 오류가 발생했을 것입니다. 따라서 더 이상 상대 파일 경로를 사용할 수 없으며 강제로 절대 경로를 지정해야 합니다. 또는 또는 와 같은 약간의 트릭입니다 .file/usr/share/pkg-name/file/home/user/file/usr/share/pkg-name/pkg-wrapper -o /home/user/filepkg-wrapper -o "$(pwd)/file"pkg-wrapper -o "$PWD/file"

이 일반적인 문제를 해결하는 불가지론적인 방법이 있습니까? 스크립트/프로세스 현재 디렉터리 대신 "사용자 현재 디렉터리"를 사용하도록 Ruby 및 Python을 패치할 수 있는 방법이 없다면 어떻게 될까요? bash 세트 옵션, 번들 exec 옵션을 살펴보았습니다.

--magicoption예를 들어 보기 위치와 소스의 루트 디렉터리를 지정하는 옵션이 있는 경우 Ruby 스크립트의 래퍼는 다음과 같을 수 있습니다 Gemfile.vendor/.bundle/

#!/bin/sh
exec bundle exec /usr/share/pkg-name/pkg-name.rb --magicoption /usr/share/pkg-name/ "\$@"

이것은 단지 Ruby 패키지의 예일 뿐이지만, 모든 언어의 모든 스크립트/바이너리에서도 동일한 문제가 발생합니다.

답변1

두 개의 작업 디렉토리를 갖는 것과 같은 모든 종류의 스크립트에 대한 솔루션은 없습니다.

가장 좋은 방법은 포장지에

  • 실제 경로가 있는 파일을 참조하는 인수를 구문 분석합니다.
  • 그런 다음 스크립트가 있는 디렉터리로 전환합니다.
  • 매개변수의 대체/전체 경로를 사용하여 프로그램을 실행합니다.

예를 들어:

#!/bin/bash
# parse args that reference files
ARG=$(realpath $1)
cd /usr/share/pkg-name
exec bundle exec pkg-name.rb "$ARG"

관련 정보