작업 폴더에서 Bash 스크립트를 실행합니다.

작업 폴더에서 Bash 스크립트를 실행합니다.

스크립트가 있는 폴더에서 파일을 실행하고 일부 구성 파일을 전달하고 동일한 폴더에 로그를 출력하는 스크립트를 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

다음 두 가지 작업을 수행할 수 있습니다.

  1. 스크립트에서는 절대 경로를 사용하십시오. 즉, 변경

    ./executablefile
    

    도착하다

    /home/user/application/executablefile
    
  2. 스크립트를 실행할 때 작업 디렉터리를 설정합니다. 유닛으로 만들고 싶다고 말씀하셨는데요 systemd. 이 경우 서비스 섹션은 다음과 같습니다.

    [Service]
    Type=forking
    ExecStart=/home/user/application/script.sh
    WorkingDirectory=/home/user/application
    

또한 시작 스크립트에서 수행하는 작업이 systemd에서 수행될 수 있는 경우가 많습니다. 환경 변수 chrt나 종속성과 같은 작업을 구성에서 수행할 수 있으므로 systemd시작 스크립트가 필요하지 않습니다.

또한 일반적 으로 실행 파일을 로 이동하고 /usr/local/bin, 로그 파일에 쓰기 가능한 공간을 남겨두고, /varjson을 /etc또는 로 이동하는 ~/.config것이 좋습니다 . 을 컴파일하는 경우 명령줄 인수를 사용하여 및 이름을 executablefile지정하는 것이 좋습니다 .logfileetcfile

답변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"

그러나 일반적인 관행은 정의된 위치에 구성을 배치하거나(이에 대한 규칙이 있음) 이를 명령줄 인수로 전달하는 것입니다.

관련 정보