시스템: 맥 빅서
저는 터미널에서 작업을 더 많이 하는데, 로그인 과정에서 주기적으로 다른 메시지를 표시하는 것이 재미있을 것이라고 생각했습니다. Fortune 명령을 .bash_profile에 추가할 수 있다는 것을 알고 있지만 시스템의 모든 사용자에 대해 motd로 실행하고 launchd/crontab을 사용하여 예약하고 싶습니다. 지난번에 스크립트를 루트로 실행하기 위해 crontab을 설정했지만 스크립트에서 명령을 찾을 수 없다는 오류가 이메일로 전송되었습니다. 이것은 내 스크립트입니다.
#!/bin/bash
#create a motd to be run by crontab every hour
fortune quotes | cowsay -f blowfish | lolcat > /etc/motd
아직 시도하지는 않았지만 그것이 문제인 경우 실행 파일의 절대 경로를 사용할 수 있다고 생각합니다. 아니면 명령 주위에 백틱을 넣어야 합니까? 파일 위치에 대한 검색 경로를 얻으려면 루트 .bashrc 파일을 변경해야 합니까?
답변1
문제는 스크립트에 올바른 환경 변수 값이 없기 때문일 가능성이 높습니다 PATH
. 어쨌든 이것은 어떤 종류의 문법 문제도 아닙니다.
다음 세 가지(또는 그 이상) 방법 중 하나로 이 문제를 해결할 수 있습니다.
스스로 제안한 대로 모든 명령에 절대 경로를 사용하십시오.
유일한 예는 당신이필요이렇게 하려면 추가하려는 디렉토리에 유틸리티의 여러 변형이 있는 경우
PATH
올바른 유틸리티 변형을 선택하는 것이 중요합니다 .예를 들어, and 와 you가
lolcat
모두 있을 수 있습니다./usr/local/bin
/opt/bin
진짜lolcat
from 을 사용하고 싶습니다 . 또한 in 대신 in 을/opt/bin
사용하고 싶습니다 . 이 경우에는 2개의 경로를 추가할 수 없습니다 .cowsay
/usr/local/bin
/opt/bin
PATH
파이프라인을 실행하기 전에 명령이 있는 디렉터리(또는 디렉터리)를
PATH
스크립트의 변수에 추가합니다. 예를 들어,#!/bin/sh PATH=$PATH:/usr/local/bin fortune quotes | cowsay -f blowfish | lolcat >/etc/motd
이
PATH
변수는 이미 환경 변수이므로 내보낼 필요가 없습니다. 이것의 이점은 스크립트가 명령에 대한 절대 경로로 가득 차 있지 않다는 것입니다(읽기가 더 쉽습니다).PATH
crontab에서 스크립트를 호출할 때 이 변수를 수정할 수도 있습니다 .0 * * * * PATH=$PATH:/usr/local/bin /path/to/my-motd-script.sh
(또는 귀하의 일정이 무엇이든.) 스크립트 환경에서 설정하려면 다음과 같이 명령줄에서 변수를 설정하십시오.
env
동일한 효과를 가진 유틸리티를 사용할 수도 있습니다 .0 * * * * env PATH="$PATH:/usr/local/bin" /path/to/my-motd-script.sh
이렇게 하면 현재 스크립트를 수정되지 않은 상태로 유지할 수 있습니다.
비대화형 셸 세션(예: cron 작업)은 파일을 읽지 않기 때문에 PATH
루트 디렉터리에서 파일을 변경해 도 전혀 효과가 없습니다..bashrc
스크립트에 실제로 필요한 것이 없기 때문에 이 행을 #!
변경 했습니다 . 이 경우에는 실제 기능보다는 미적인 면과 더 관련이 있습니다.#!/bin/sh
bash