스크립트가 있는 폴더에서 파일을 실행하고 일부 구성 파일을 전달하고 동일한 폴더에 로그를 출력하는 스크립트를 Bash에서 수행했습니다. 예를 들어 다음과 같은 구조가 됩니다.
/home/user/application
내부에는 다음과 같은 파일이 있습니다.
script.sh # this would be the script to launch
executablefile # this would be the file to run, it's called by the script as "./executable", since it's not in $PATH
config.json # a config file for the executable that is passed by the script using arguments
logfile # A log file written by the script, redirecting all Standard and Error output to the log file using tee
그래서 CD를 폴더에 넣고 스크립트를 실행하면 모든 것이 잘 작동합니다. 그러나 다른 위치에서 이 스크립트를 호출하면 실행 파일을 찾을 수 없으며 구성을 검색하고 호출된 위치에서 로그 파일을 출력할 가능성이 높습니다. 이것은 내가 원하는 것이 아닙니다.
그러면 sh 스크립트에 어떤 변경 사항을 쓸 수 있나요? 스크립트가 시작될 때 스크립트 디렉토리를 작업 디렉토리로 생성하는 방법은 무엇입니까?
나의 주요 아이디어는 나중에 이 스크립트를 호출할 시스템 서비스 파일을 작성하는 것입니다.
감사해요.
답변1
다음 두 가지 작업을 수행할 수 있습니다.
스크립트에서는 절대 경로를 사용하십시오. 즉, 변경
./executablefile
도착하다
/home/user/application/executablefile
스크립트를 실행할 때 작업 디렉터리를 설정합니다. 유닛으로 만들고 싶다고 말씀하셨는데요
systemd
. 이 경우 서비스 섹션은 다음과 같습니다.[Service] Type=forking ExecStart=/home/user/application/script.sh WorkingDirectory=/home/user/application
또한 시작 스크립트에서 수행하는 작업이 systemd에서 수행될 수 있는 경우가 많습니다. 환경 변수 chrt
나 종속성과 같은 작업을 구성에서 수행할 수 있으므로 systemd
시작 스크립트가 필요하지 않습니다.
또한 일반적 으로 실행 파일을 로 이동하고 /usr/local/bin
, 로그 파일에 쓰기 가능한 공간을 남겨두고, /var
json을 /etc
또는 로 이동하는 ~/.config
것이 좋습니다 . 을 컴파일하는 경우 명령줄 인수를 사용하여 및 이름을 executablefile
지정하는 것이 좋습니다 .logfile
etcfile
답변2
실행 파일을 찾을 수 없습니다
쉘은 다음을 사용하여 다른 명령을 찾습니다.경로 변수. 그러나 실행 파일 경로에 구성 파일을 보관하는 것은 좋은 습관이 아닙니다.
실행 파일을 찾을 수 없습니다
방법을 말하면 다음과 같습니다.
MYDIR=$( dirname ( realpath "$BASH_SOURCE[0]" ))
# Above gets the path of the current script, cleans it up and removes the
# script filename and preceding '/'
"$MYDIR/executablefile" "$MYDIR/config.json" >> "$MYDIR/logfiles"
그러나 일반적인 관행은 정의된 위치에 구성을 배치하거나(이에 대한 규칙이 있음) 이를 명령줄 인수로 전달하는 것입니다.