상대 경로를 사용하는 bash 스크립트가 있습니다. 스크립트가 저장된 디렉터리와 동일한 작업 디렉터리가 있어야 합니다. 프롬프트에서 실행하면 먼저 스크립트 디렉터리로 CD를 이동할 수 있기 때문에 잘 작동합니다. 그러나 /etc/cron.hourly에서 스크립트에 대한 심볼릭 링크를 생성하면 스크립트가 중단됩니다.
bash 스크립트 디렉토리를 스크립트가 저장된 디렉토리로 변경하는 방법이 필요합니다. 그러나 나는 지금까지 성공하지 못했습니다. 스크립트가 심볼릭 링크를 통해 cron에서 호출되는 경우에도 이를 수행할 수 있는 쉬운 방법이 있습니까?
답변1
일반적으로 쉘은 스크립트를 읽어야 하기 때문에 항상 스크립트 경로를 알고 있습니다. 어떤 경우에는 그렇지 않습니다.setuid 스크립트이를 지원하는 운영 체제(Linux가 아님)에서 - 그러나 setuid 쉘 스크립트는 어쨌든 나쁜 생각입니다. 게다가 스크립트는 셸이 열린 시간과 이를 사용하여 작업을 시도한 시간 사이에 이동했을 수 있습니다. 따라서 보안이나 안정성 문제가 없는 경우에만 스크립트 경로를 사용하십시오. 구조가 알려진 패키지는 유효한 사용 사례입니다.
쉘 인터프리터에 전달된 스크립트 경로는 특수 매개변수에서 찾을 수 있습니다 $0
. 상대 경로일 수 있으므로 사용하려면 다른 디렉터리로 변경하기 전에 사용하세요. 이 시간 동안 스크립트가 이동되지 않는다는 것을 알고 있는 경우 이를 사용할 수 있습니다.
심볼릭 링크일 수 있으므로 $0
대상을 가져와야 합니다. 이를 수행하는 POSIX 방법은 없지만 Linux(GNU coreutils 또는 BusyBox) 및 최근에는 BSD에서 readlink -f
사용할 수 있습니다.표준 절대 경로.
script_path_in_package=$(readlink -f -- "$0")
script_directory=${script_path_in_package%/*}
이로 인해 패키지를 빌드하는 방법이 제한됩니다. 예를 들어, 아키텍처 독립적 디렉터리 트리에 스크립트를 배치하고 각 아키텍처별 디렉터리 트리 내에서 해당 스크립트에 연결할 수 없습니다.
답변2
정확하게 속성을 지정할 수 있도록 이 정보를 어디서 얻었는지 기억이 나지 않지만 실행 중인 스크립트에 대한 "표준" 경로를 얻기 위해 오랫동안 이 정보를 사용해 왔습니다. 사양에 따르면 "."가 없는 절대 경로를 의미합니다. 또는 ".."이 포함되어 있습니다.
CANON=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)/$(basename -- "$0")")
필요한 경우 $CANON의 기본 이름과 디렉터리 이름을 사용하여 이러한 값을 가져옵니다.
답변3
당신은 이것을 할 수 있어야합니다.
- $0 매개변수는 스크립트를 호출할 때 전체 경로(이름 포함)로 확장됩니다.
- 내장 쉘 기능시험(또는[ ]) 다음을 사용하여 경로가 심볼릭 링크인지 테스트할 수 있습니다.-엘
ls -l
, 기호 링크에 적용하면 실제 경로가 최종 필드로 포함된 단일 출력 라인이 제공됩니다.
이는 소스의 위치를 발견하는 데 충분합니다. 물론 이것은 재귀적으로 이 작업을 수행해야 하는 심볼릭 링크일 수 있습니다.
답변4
이 변수는 $0
프로그램의 이름을 보유합니다. 하다
cd $(dirname $( readlink $0) )
프로그램이 위치한 디렉토리로 변경합니다.
예,$0
문제가 있을 수 있습니다., 일반적인 경우에 사용되는 경우. 설정이 명확하게 정의된 특정 상황에서는 본인의 업무에 활용해도 괜찮을 것 같습니다.
특히, 스크립트는 어쨌든 작업을 위해 해당 디렉토리를 사용해서는 안 되며 환경 변수나 구성 파일에 의존해야 합니다. 그렇다면 "스크립트를 시작한 이후 누군가가 스크립트를 이동했을 수 있습니다" 또는 ksh가 이를 자세히 설명하는 방법에 관심을 가질 이유가 무엇입니까? (이것이 bash 스크립트라는 것을 알고 있다고 가정합니다).