Wie kann man eine launchd plist dazu bringen, einen komplexen 1-Zeilen-Bash-Befehl direkt auszuführen?

13

Ich habe einen ziemlich komplexen bash-Befehl, der einige Pipes und eine if-then-else-Klausel enthält, ganz zu schweigen davon, dass ein Systemprogramm (wie grep) mit mehreren Parametern aufgerufen wird.

Gibt es eine Möglichkeit, eine Plist zu erstellen, mit der launchd diesen komplexen Befehl direkt lädt und ausführt? (Im Gegensatz dazu, dass die plist auf eine Bash-Skriptdatei verweist, die den komplexen Befehl enthält)

Vielen Dank.

UrEl
quelle

Antworten:

16

Ja. Wenn die Einrichtung ProgramArgumentsElement, verwenden Sie einfach bashals erstes Argument, -cals das zweite Argument, dann [your commands]( wir erinnern uns alle XML - Einheiten zu ersetzen, wie >, &und so weiter) als dritte, etwa so:

<key>ProgramArguments</key>
<array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>ls -1 | grep *.txt | echo &gt; allTextFiles</string>
</array>

Ersetzen Sie das dritte Element des Arrays durch Ihren tatsächlichen Befehl.

Scott
quelle
1
Ich habe das noch nicht getestet, aber ich bin mir ziemlich sicher, dass Sie keine Anführungszeichen um die Befehlszeichenfolge wünschen, sondern dass Sie sie mit einer HTML-Entität codieren müssen (z. B. &gt;und &lt;anstelle von >und <für Umleitungen verwenden).
Gordon Davisson
@ Gordon Davisson - Sie haben sicherlich Recht mit den Anführungszeichen - sie dienen dem gleichen Zweck, wie sie zu einem Element des Arrays zu machen. Ich bin mir ziemlich sicher, dass Sie auch in Bezug auf XML-Entitäten Recht haben. Guter Fang. Ich habe meine Antwort entsprechend bearbeitet.
Scott