Applescript zum Öffnen eines NEUEN Terminalfensters im aktuellen Bereich

Applescript zum Öffnen eines NEUEN Terminalfensters im aktuellen Bereich

Ja, ich habe als Neuling schreckliche Erfahrungen mit Apple Script gemacht.

Ich muss ein neues Terminalfenster im aktuellen Desktopbereich öffnen. NICHT in einen anderen Bereich verschieben, in dem ein Terminal läuft, und dann ein anderes Terminalfenster öffnen.

Wenn Terminal nicht läuft, sollte natürlich ein neuer Terminalprozess gestartet werden.

Antwort1

tell application "Terminal"  
    do script " "  
    activate  
end tell

Es scheint seltsam, aber es nutzt eine Besonderheit in der Art und Weise aus, wie Terminal eingehende „do script“-Befehle verarbeitet; es erstellt für jeden Befehl ein neues Fenster. Sie könnten das tatsächlich durch etwas Nützliches ersetzen, wenn Sie möchten; es führt alles aus, was Sie wollen, direkt nach dem Öffnen des neuen Fensters.

Antwort2

Wenn Sie zwischen den Befehlen des Skripts " " keinen Text haben, wird im Terminal keine zusätzliche Eingabeaufforderung angezeigt.

tell application "Terminal"  
    do script ""  
    activate  
end tell

Antwort3

Mir fallen drei verschiedene Möglichkeiten ein, dies zu tun (die ersten beiden habe ich irgendwo geklaut, aber ich habe vergessen, woher). Ich verwende die dritte, die ein Shell-Skript aus dem Applescript aufruft, weil ich jedes Mal ein neues Fenster öffnen möchte und weil es die kürzeste war.

Im Gegensatz zu dem seit mindestens 10.10 in OS X integrierten Skript öffnen alle diese das Terminal in dem Verzeichnis, das das aktuelle Arbeitsverzeichnis in Ihrem Finder-Fenster ist (d. h. Sie müssen keinen Ordner ausgewählt haben, um ihn zu öffnen).

Enthält außerdem einige Bash-Funktionen, um den Kreis Finder > Terminal > Finder zu vervollständigen.

1. Verwenden Sie eine vorhandene Registerkarte erneut oder erstellen Sie ein neues Terminalfenster:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if (exists window 1) and not busy of window 1 then
        do script "cd " & quoted form of myDir in window 1
    else
        do script "cd " & quoted form of myDir
    end if
    activate
end tell

2. Verwenden Sie eine vorhandene Registerkarte erneut oder erstellen Sie eine neue Terminal-Registerkarte:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if not (exists window 1) then reopen
        activate
    if busy of window 1 then
        tell application "System Events" to keystroke "t" using command down
    end if
    do script "cd " & quoted form of myDir in window 1
end tell

3. Erzeugen Sie jedes Mal ein neues Fenster über ein Shell-Skript, das von einem Applescript aufgerufen wird

tell application "Finder"
    set myDir to POSIX path of (insertion location as alias)
    do shell script "open -a \"Terminal\" " & quoted form of myDir
end tell

4. (BONUS) Bash-Alias ​​zum Öffnen eines neuen Finder-Fensters für das aktuelle Arbeitsverzeichnis in Ihrem Terminal

Fügen Sie diesen Alias ​​zu Ihrem .bash_profile hinzu.

alias f='open -a Finder ./' 

5. (BONUS) Wechseln Sie in Ihrem Terminalfenster zum Pfad des vorderen Finder-Fensters

Fügen Sie diese Funktion zu Ihrem .bash_profile hinzu.

cdf() {
      target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
        if [ "$target" != "" ]; then
            cd "$target"; pwd
        else
            echo 'No Finder window found' >&2
        fi
}

Antwort4

Die obigen Antworten funktionieren nur, wenn Terminal bereits ausgeführt wird. Andernfalls werden zwei Terminalfenster gleichzeitig geöffnet - eines wegen do scriptund eines wegen activate.

Dies lässt sich durch ein einfaches if ... else verhindern:

if application "Terminal" is running then
    tell application "Terminal"
        do script ""
        activate
    end tell
else
    tell application "Terminal"
        activate
    end tell
end if

Bonus:

Wenn Sie Befehle direkt ausführen möchten, können Sie dies durch Tastenanschläge tun (nicht sehr elegant – ich weiß! Aber es funktioniert)

[...]
else
    tell application "Terminal"
        activate
        tell application "System Events" to keystroke "ls -la" 
        tell application "System Events" to key code 36
    end tell
end if

verwandte Informationen