CWD 및 파일 경로 문자열은 launchctl 호출에서 자동으로 연결됩니다.

CWD 및 파일 경로 문자열은 launchctl 호출에서 자동으로 연결됩니다.

현재 내 기능을 작성하려고합니다.배시 구성 파일이로 인해 OSX LaunchAgent가 인수로 전달되어 다시 시작됩니다. 다소 무의미할 수도 있지만 나에게는 더 이상 긴 경로를 쓰고 싶지 않습니다.launchctl un/load

나는 launchctl에 대한 마지막 호출을 제외하고 거의 모든 작업을 수행했습니다. 다음은 함수 스크립트와 후속 오류 메시지입니다.

기능

launchctl_mgr() {
        failure() {
                local lineno=$1
                local msg=$2
                echo "Failed at $lineno: $msg"
        }
        trap 'failure ${lineno} "$BASH_COMMAND"' ERR
        trap 'trap - ERR' RETURN

        instruction=$1
        filepath=$2;
        #test whether the file argument is already a file or not and whether or not it is actually$
        if [[ ! -f $2 ]]
        then
                if [[ -f ~/Library/LaunchAgents/$2.plist ]]
                then
                        filepath="~/Library/Launchagents/$filepath.plist"
                        echo "found!: $filepath"
                elif [[ -f /Library/LaunchAgents/$2.plist ]]
                then
                        filepath="/Library/LaunchAgents/$filepath.plist"
                else
                        echo "debug: ~/Library/LaunchAgents/$filepath.plist"
                        echo "Filename supplied was not valid as a launchagent"
                        return 1
                fi
        fi
        if [[ $instruction=="restart" || instruction=="unload" ]]
        then
                echo "instruction is $instruction"
                echo "filepath is $filepath"
                launchctl stop $filepath
                launchctl unload $filepath
                if [[ instruction=="restart" ]]
                then
                        launchctl load $filepath
                        launchctl start $filepath
                fi
        fi
}

출력/오류

____________________ => launchctl_mgr unload local.unminimise
found!: ~/Library/Launchagents/local.unminimise.plist
instruction is unload
filepath is ~/Library/Launchagents/local.unminimise.plist
Failed at launchctl stop $filepath:
/Users/[current_user]/~/Library/Launchagents/local.unminimise.plist: No such file or directory
/Users/[current_user]/~/Library/Launchagents/local.unminimise.plist: No such file or directory
Failed at launchctl start $filepath:

("[current_user]"는 실제 사용자 계정 이름을 대체합니다)

launchctl에서 볼 수 있듯이 bash와 launchctl 모두 현재 디렉터리 경로와 launchctl에 입력한 경로 문자열이 연결되어 오류가 발생합니다. 파일 경로 문자열이 인쇄되고 이전 줄에서는 괜찮아 보입니다.

답변1

  1. [[ ... ]] 테스트에서는 == 앞뒤에 공백이 필요합니다. 그렇지 않으면 문자열로 평가되고 비어 있지 않은 것은 항상 true입니다.

    예를 들어:

    $ instruction=whatever
    $ [[ $instruction=="restart" ]] && echo true || echo false
    true
    

    이는 다음과 같습니다.

    $ [[ whatever=="restart" ]] && echo true || echo false
    true
    

    또한 다음과 동일합니다(다른 여러 변형도 포함).

    $ [[ -n 'whatever=="restart"' ]] && echo true || echo false
    true
    

    $instruction이 모든 경우에 "다시 시작"이 동일한 지 확인하지 않습니다 . 대신 문자열이 whatever=="restart"비어 있지 않은지 테스트하고 있습니다. 문자열에는 문자 순서가 정확히 포함되어 있지만 ==이는 중요하지 않습니다. 이는 문자열에 포함된 문자일 뿐이며 특별한 의미는 없습니다.

    비교:

    $ instruction=whatever
    $ [[ $instruction == "restart" ]] && echo true || echo false
    false
    $ instruction=restart
    $ [[ $instruction == "restart" ]] && echo true || echo false
    true
    

  1. 스크립트에는 $before 변수가 누락된 곳도 있습니다. 예를 들어

    if [[ $instruction=="restart" || instruction=="unload" ]]
    

    선행 및 후행 공백이 필요합니다.== 그리고$두 번째 앞에 a instruction:

    if [[ $instruction == "restart" || $instruction == "unload" ]]
    

    여기도 마찬가지:

    if [[ instruction=="restart" ]]
    

    이는 다음과 같아야 합니다:

    if [[ $instruction == "restart" ]]
    

  1. 변수(및 쉘 위치 매개변수)를 사용할 때는 큰따옴표로 묶어야 합니다. 예를 들어

    local lineno="$1"
    local msg="$2"
    

    그리고:

    instruction="$1"
    filepath="$2"
    

    그리고:

    launchctl stop "$filepath"
    launchctl unload "$filepath"
    

  1. 독립형 스크립트 대신 함수로 작성하는 이유는 무엇입니까? 현재 쉘의 환경을 변경하는 데 필요합니까?

    함수를 작성하는 데에는 아무런 문제가 없지만,생각하다현재 쉘의 환경을 변경하고 싶다면, 실수로 환경이 변경되는 일이 없도록 별도의 스크립트에서 제공하는 격리 기능을 활용하는 것이 좋습니다.

    또는 진술모두함수 변수( $instruction및 포함 $filepath) local를 변경했지만 이는 변수가 변경되는 것을 방지하는 데에만 작동하며 함수는 여전히 셸의 현재 디렉터리와 같은 다른 항목을 변경할 수 있습니다.

답변2

bash 구문에 대한 답변과 도움을 주신 Cas에게 많은 감사를 드립니다. 하지만 몇 가지 작업을 통해 알게 되었습니다.틸데in은 ~/Library/LaunchAgents/[agent]경로 연결에 문제를 발생시키는 대신 스크립트가 실제로 예상대로 작동하도록 하는 원인입니다.

어떤 이유로 launchctl 주소 매개변수에서 물결표가 확장되지 않으므로 다른 사람에게 이 문제가 있는 경우 다음을 사용하십시오.

$HOME/Library/LaunchAgents/[agent]

launchctl 명령으로 에이전트의 주소를 지정하세요.

경로는 설명대로 입니다여기아래에"이전 명령"을 누른 다음 "로드"

알아채다:내 스크립트의 경우 적어도 이것은 launchctl 발생 오류를 실제로 수정하지는 않았지만 기능은 수정했습니다. 문서에는 다음과 같이 나와 있습니다.

이전 구현의 버그와 이러한 버그에 대한 고객의 오랜 기대로 인해 로드 및 언로드 하위 명령은 부적절한 사용으로 인해 0이 아닌 종료 코드만 반환합니다. 그렇지 않으면 항상 0이 반환됩니다.

..스크립트가 예상대로 작동하고 수동 복사 명령이 오류 메시지를 표시하지 않는 경우에도 내가 설정한 ERR 트랩은 항상 메시지 없이 오류를 발생시킵니다.

누군가 내 무지를 보상해줄 수도 있겠지만, 내가 제안한 후에도 여전히 두통이 느껴진다면 시도해 launchctl list | grep [agent_name]보고 원하는 효과가 나타나는지 확인해 보세요.

관련 정보