내가 직면하는 일반적인 패키징 문제는 도구가 루트 디렉터리(설치 디렉터리)에서 관련 리소스를 찾을 때입니다.
예를 들어. 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/file
pkg-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"