Automator: Wechseln Sie in das ausgewählte Verzeichnis und führen Sie das Shell-Skript aus

Ich versuche, einen Kontextmenübefehl über den Automator-Dienst zu erstellen. Der Kontextmenübefehl führt ein Shell-Skript aus, um einige Standarddokumente im angegebenen Verzeichnis zu erstellen.

Ich habe das Shell-Skript geschrieben, das korrekt ausgeführt wird, wenn es aus dem Zielverzeichnis ausgeführt wird:

#!/bin/bash


touch History.markdown
touch Notes.markdown
touch Plan.markdown

touch ProjectName.tmproj

cat <<TEXT > ProjectName.tmproj
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>currentDocument</key>
    <string>Notes.markdown</string>
    <key>documents</key>
    <array>
        <dict>
            <key>filename</key>
            <string>Notes.markdown</string>
            <key>selected</key>
            <true/>
        </dict>
        <dict>
            <key>filename</key>
            <string>History.markdown</string>
        </dict>
        <dict>
            <key>filename</key>
            <string>Plan.markdown</string>
        </dict>
    </array>
    <key>openDocuments</key>
    <array>
        <string>History.markdown</string>
        <string>Notes.markdown</string>
        <string>Plan.markdown</string>
    </array>
    <key>fileHierarchyDrawerWidth</key>
    <integer>200</integer>
    <key>metaData</key>
    <dict/>
    <key>showFileHierarchyDrawer</key>
    <true/>
    <key>windowFrame</key>
    <string>{{113, 95}, {1230, 900}}</string>
</dict>
</plist>
TEXT

Ich habe dann Automator geöffnet und einen neuen Dienst erstellt. foldersIch habe den Dienst so eingestellt, dass er ausgewählte Eingaben von in empfängt Finder.

Ich habe dann am Anfang meines Shell-Skripts Folgendes hinzugefügt, um das ausgewählte Verzeichnis als Standardeingabe zu erhalten:

FolderPath=$1
$(cd $FolderPath)

Die Variable FolderPathbekommt auf jeden Fall das aktuelle Verzeichnis. Ich habe dem Shell-Skript ein hinzugefügt say $FolderPathund es sagt den gesamten Pfad aus, wenn es über den Kontextmenübefehl ausgeführt wird.

Das Problem ist, dass nichts passiert, wenn ich versuche, in das Verzeichnis in der Variablen zu wechseln. Ich habe einen anderen sayBefehl eingefügt, der den Befehl pwdnach dem Verzeichniswechsel gesprochen hat, und er besagt, dass ich im Stammverzeichnis meines Benutzers bin.

Gibt es etwas, das Automator beim Umgang mit Shell-Skripten anders macht?

Hier ist ein Screenshot des gesamten Dienstes.Geben Sie hier die Bildbeschreibung ein

Ich sollte auch erwähnen, dass ich versucht habe, den Ordnerpfad und den Dateinamen, den ich versucht habe, mit dem touchBefehl zu erstellen, einfach zu verketten, und wenn ich dies tue, wird nur der Zeichenfolgenname der zu erstellenden Datei verwendet:

say "$FilePath/History.markdown" # only says "History dot markdown"

Jede Hilfe wäre sehr willkommen!

Warum benutzt du $(cd $FolderPath)statt cd $FolderPath?
Ich habe es cd $FolderPathzuerst versucht und es hat nicht funktioniert, also habe ich versucht, den Befehl mit zu erzwingen $()und ihn einfach nicht herausgezogen, nachdem es immer noch nicht funktioniert hat.
Sie können einen Befehl nicht mit erzwingen$() , führen Sie ihn direkt in aus bash, um zu sehen, was passiert.
Bei einigen Befehlen können Sie die Verwendung erzwingen, $()da der Befehl innerhalb der Klammern in einer Subshell ausgeführt und das Ergebnis zurückgegeben wird (obwohl er jetzt auf meinen Befehl zurückblickt, würde er nichts mit dem cd-Befehl tun, da der Bereich der Navigation die Subshell ist). Wie auch immer, ich habe es in Bash ausgeführt und es funktioniert gut (ich habe es ursprünglich für Bash gebaut). Als Test habe ich gerade den folgenden Befehl geschrieben, der erfolgreich ausgeführt wird, wenn er von einer Shell ausgeführt wird: say $(pwd) FolderPath="/Volumes/Secure/TEMP/" cd $FolderPath say $(pwd). Dieselbe Struktur, die im Automator verwendet wird, ändert das Verzeichnis nicht erfolgreich.
Entschuldigung, ich hatte im letzten Kommentar keinen Platz mehr. Wenn Sie einen Automator-Dienst nur mit den Schritten erstellen: ` #!/bin/bash say $(pwd) FolderPath=$1 cd $FolderPath say $(pwd)' Der Finder spricht jedes Mal dasselbe Verzeichnis. Das cdändert nicht wirklich Verzeichnisse.

Antworten (1)

Das Problem hier ist, dass Sie die Eingabe an übergeben haben stdin. Ich weiß nicht, warum das die Standardeinstellung ist, aber Sie sollten in der Lage sein, das Popup-Menü oben rechts einfach auf "als Argumente" zu ändern. Ich habe das getan und cd "$1"am Anfang des Skripts hinzugefügt und es hat funktioniert.

Eindrucksvoll! Danke für den Hinweis. Ich habe es umgestellt as argumentsund alles funktioniert wie es soll. Danke für die Hilfe!