프로그램 인수를 올바르게 읽기 위해 시작하기


18

실행하려고하는 명령이 잘못되어 (잘못된 단어는 아니지만 지금은 잘못된) 스크립트가 실행되어 부적절한 사용법에 대해 불평합니다.

내가 얻는 특정 오류는 명령의 사용 텍스트가 시스템 로그에 덤프 된 것입니다. 이것으로부터 plist의 다른 정보 (명령에 대한 경로, 타이밍 등)가 명령의 옵션이 아니라 올바르게 구문 분석되고 있음을 추측합니다.

명령 사용 후 마지막 줄이 하나 있습니다.

18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1

그러나 그것은 단지 "오류와 함께 종료되었습니다"를 의미합니다.

나는 launchd가 명령을 옵션에서 분리하고 매뉴얼 페이지에서 ProgramArguments에 대해 알려줍니다.

글쎄, 나는 execvp (3)을 읽고 나는 더 현명한 사람이 아니므로, 당신에게 사랑스러운 많은 것을 요구하고 있습니다.

일반적으로 터미널에서 명령을 실행하면 다음과 같습니다.

/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

이것은 치료를합니다.

그리고 이것이 LaunchAgent plist의 Program / ProgramArguments 섹션에서 나누는 방법입니다.

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host localhost</string>
        <string>--passwd gobbledygook</string>
        <string>--project http://setiathome.berkeley.edu/ update</string>
    </array>

(기록을 위해 원래 boinccmd \ escaped 경로가 있었지만 작동하지 않아 경로에서 탈출 공간이 시작되었습니다.)

나는 논쟁을 더 세분화하려고 노력했다.

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

그러나 그것은 작동하지 않는 것 같습니다.

그 어느 때보 다, 나는 아주 간단한 것을 놓치고 있다고 확신합니다.

감사.


대답:

ProgramArguments의 첫 번째 줄은 프로그램의 경로 여야합니다. 이것은 저를 트립하고 실제로 "... 매우주의 깊게 읽어주십시오! .."라는 주석의 의미입니다. 내가 그 모든 것을 제자리에 두었을 때 모든 것이 매력을 발휘합니다. 대단히 감사합니다.

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

이것이 왜 필요한지에 대한 이해를 돕기 위해 마지막 편집은 SirPavlova의 설명을 참조하십시오.

~ W


launchctl list com.label.plist를 사용하면 launchd가 올바른 명령 부분을 가져 오는 것을 알 수 있습니다. 아마도 그것이-와 관련된 문제라고 생각했지만 분명히 아닙니다.
Woodgie

1
귀하의 문제에 대한 답변이 없지만 첫 번째 예제 <string>--host localhost</string>는 확실히 작동 하지 않습니다 . 쉘에 명령 행을 작성할 때 옵션의 일부와 일반 인수가 무엇인지 모릅니다 . 인수를 실행중인 프로그램에 전달 하기 전에 공백으로 분할됩니다 . 또한 boinccmd보고 하는 정확한 오류를 표시하는 것이 도움이 될 수 있습니다 .
케빈 레이드

내가보고있는 것을 말하도록 게시물을 수정했습니다. 도움이 될 수는 없습니다! 또한 옵션을 공백으로 분할하면 동일한 오류가 발생합니다. 나는 그것이 어떻게 든 문제를 일으키는 것으로 추측합니다.
Woodgie

1
둘 다가 아닌 Program 또는 ProgramArguments 만 사용하려고합니다
user151019

답변:


19

Program키 지정 파일을 실행하기 위해, ProgramArguments키는 실행 프로세스에 전달되는 인수를 지정한다. 엄밀히 말하면 프로세스에 원하는 인수를 전달할 수 있지만 첫 번째 규칙은 프로세스가 호출 된 이름이어야하므로 대부분의 프로그램은 첫 번째 인수를 무시합니다. 실행할 파일은 반드시 필요한 정보이지만, Program키가 누락 된 경우 실행 된 파일 은 ProgramArguments 순전히 편의상 첫 번째 인수와 동일한 값을가 집니다.

첫 번째 예제는 boinccmd를 시작하고 터미널 명령과 동일한 인수를 제공합니다.

--host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update

이것은 boinccmd에게 "--host localhost"로 호출하고 이상한 인수 두 개만 전달했음을 알려줍니다.

두 번째 예는 인수를 올바르게 분리하지만 Eddie Kelley가 제안한 것처럼 앞에 삽입해야합니다. boinccmd에 "--host"로 호출 한 다음 다른 6 개의 인수를 전달했음을 알려줍니다. boinccmd는 마지막 5 개를 두 가지 옵션으로 인식 할 수 있지만 "localhost"비즈니스가 무엇인지 전혀 모릅니다. boinccmd가 알 수있는 한 터미널에서 다음과 같이 호출되었습니다.

/Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

누락 된 "--host"에 유의하십시오.

boinccmd는 아마도 첫 번째 인수가 무엇인지 신경 쓰지 않는 대부분의 프로그램 중 하나 일 것이므로 실제로 배열 <string>HELLO</string>의 머리 부분을 밀어 넣을 수는 ProgramArguments있지만 Program키를 완전히 제거하고 이것을 사용하는 것이 더 깨끗할 것입니다 .

<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

그것은 의미가 중복처럼 보일 수 있지만, 일부 프로그램은 좋은 효과를이 사용 bash는 등. 첫 번째 인수가로 시작하면 로그인 쉘 역할을하고 -, Vim은 첫 번째 인수가 ed또는 vi대신에 다양한 에뮬레이션 모드로 들어갑니다 vim.


1
내가 내 주요 게시물을 편집하는 동안 게시했습니다! 이것은 훌륭한 설명입니다. 감사합니다.
Woodgie


@SirPavlova, 큰 도움이되었습니다! 그러나 콘솔 호출을 plist 형식으로 변환하는 데 도움이되는 도구가 있습니까?
gaussblurinc

6

exec (3) 매뉴얼 페이지에 따르면 첫 번째 프로그램 인수는 실행 파일의 경로 여야합니다.

The execv(), execvp(), and execvP() functions provide an array of pointers to null-terminated strings
 that represent the argument list available to the new program.  The first argument, by convention,
 should point to the file name associated with the file being executed. The array of pointers must be
 terminated by a NULL pointer.

인덱스 0에서 인수로 실행 파일의 경로를 지정할 수 있다면 도움이 될 수 있습니다 ...


내가보기 위해 게시물을 편집 한 것처럼 boinccmd를 찾아서 실행 중이며 전달 된 옵션은 어떻게 든 엉망입니다. 당신이 말하는 것을 놓치지 않는 한.
Woodgie

1
프로그램에서 발견 된 @Woodgie 예-ProgramArguments가 잘못되었습니다. 실행 파일의 경로 이름이 필요합니다
user151019

오. 오! 나는 지금 본 것 같아요. 잠깐만, lemme 테스트 해봐
Woodgie

BINGO는 그렇게하고 각 명령의 각 부분을 자체 <string> </ string> 컨테이너에 넣었습니다. 감사합니다. 나는 당신에게 간단하다고 말했다!
Woodgie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.