애플리케이션에 대한 심볼릭 링크 - 작업 디렉터리

애플리케이션에 대한 심볼릭 링크 - 작업 디렉터리

Programming이라는 하위 폴더에 있는 파일에서 데이터를 읽는 이라는 폴더에 bash 스크립트가 있다고 가정해 보겠습니다 data.
스크립트의 파일 경로는 모두 이 "프로그래밍" 폴더에 상대적입니다.
echo "test" > ./data/test.txt.
따라서 작업 디렉터리는 항상 "Programming" 폴더여야 합니다.
스크립트가 모든 테스트를 통과하면 완료되며 "Programming" 폴더의 전체 내용을 하위 폴더에 쉽게 복사한 다음 /optThe script linked to라는 폴더에 심볼릭 링크를 생성하여 환경에서 연결할 수 있다고 생각했습니다. ./opt/myapplication/usr/binmyapplication/opt/myapplication/bash_script

하지만 문제는 이제 내 작업 디렉터리가 있는 곳에서 myapplication을 호출하면 문제가 됩니다.

$PWD= #actual shell directory at script start
$0=/usr/bin/myapplication
${BASH_SOURCE[0]}=/usr/bin/myapplication

신청이 실패했습니다. 나는 심볼릭 링크가 작업 디렉토리를 파일이 있는 곳으로 변경할 것이라고 생각했습니다.

Unix의 일반적인 관행은 무엇입니까? 항상 실행 파일이 있는 위치로 작업 디렉터리를 설정하여 상대 경로를 사용하시겠습니까?

답변1

Unix의 일반적인 관행은 무엇입니까? 항상 실행 파일이 있는 위치로 작업 디렉터리를 설정하여 상대 경로를 사용하시겠습니까?

실제로 그렇지 않습니다. 대부분의 경우 $0이를 기반으로 스크립트 내부에서 a를 사용하고 실행할 수 있지만 표시된 내용은 상대 경로 자체이거나 심볼릭 링크를 통한 경로일 수 있으므로 별로 도움이 되지 않을 수 있습니다.cd$0

( argv[0]호출자로부터 직접 가져온 바이너리 실행 파일의 경우 Bash에서 execve()호출에 포함된 항목으로 설정할 수 있습니다. (exec -a anything /path/to/file)이는 스크립트가 시작되는 방식으로 인해 스크립트 내에서 다르게 작동합니다.)$0

그러나 또 다른 질문은 이것을 해야 하는지 여부입니다. 일반적인 아이디어는 도구를 의 일부 디렉토리에 두고 PATH데이터 파일이 있는 디렉토리에서 도구를 사용하는 것입니다. 이렇게 하면 여러 사용자가 여러 데이터 파일 세트에서 하나의 도구를 사용할 수 있습니다.

기본 경로를 설정하는 또 다른 일반적인 방법은 환경 변수를 사용하는 것입니다. 스크립트에 이와 같은 내용이 포함되어 있으면 if [ -d "$MYAPP_DIR" ]; then cd "$MYAPP_DIR"; fi사용자는 MYAPP_DIR필요에 따라 이를 쉘의 시작 파일에 설정할 수 있습니다.

물론 도구에는 도구와 함께 제공되는 일부 정적 데이터가 필요할 수 있습니다. 이를 찾으려면 몇 가지 가능성을 볼 수 있습니다.

  • 정적 데이터가 어디에 있는지 알려면 구성 파일의 고정 경로를 사용하십시오. 고정 경로는 일반적으로 다음과 같습니다 /etc/mytool/config. 여기서 단점은 관리자가 아닌 설치에서는 작동하지 않는다는 것입니다.
  • 위치는 컴파일 타임에 설정되고 바이너리 자체에 저장됩니다. 데이터 경로는 일반적으로 와 유사 /usr/share/lib/mytool/whatever하지만 다른 것일 수도 있지만 설치 수명 동안 변경되지 않을 수 있습니다. (이건 흔한 일이라고 생각하지만, 어떻게 보면 추악한 느낌도 듭니다.)
  • 환경 변수를 사용하십시오. 여기서 단점은 사용자가 무엇이든 작동하도록 설정해야 한다는 것입니다. 따라서 다른 방법에 대한 대체/재정의로 사용하는 것이 가장 좋습니다.

관련 정보