Öffnen Sie einen neuen Tab in iTerm und führen Sie dort den Befehl aus

Ich habe eine Möglichkeit gefunden, einen neuen Tab zu öffnen in iTerm:

newtabi()
{
    osascript -e 'tell application "iTerm" to activate' -e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down'
}

Und ich möchte einige Befehle in einem neuen Tab ausführen. Lass es ein einfacher Befehl sein pwd. Wie es geht?

Wenn ich renne ...

newtabi && pwd

Die neue Registerkarte wird wie erwartet geöffnet, aber pwdder Befehl wird nicht in der neuen Registerkarte ausgeführt, sondern in der alten, in die ich eingegeben habenewtabi && pwd

Ich benutze zsh. Mein Betriebssystem istOS X 10.8.5

Diese Frage ist 8 Jahre alt und die akzeptierte Antwort ist alles andere als ideal. Ich hoffe immer noch, einige Argumente zu sehen open -a iTerm, um einen Befehl auszuführen.

Antworten (6)

Verwendung tell session -1 of current terminal to write text "pwd":

activate application "iTerm"
tell application "System Events" to keystroke "t" using command down
tell application "iTerm" to tell session -1 of current terminal to write text "pwd"
Wenn mehr als eine geöffnet wird, wird eine iTermsneue Registerkarte in der richtigen iTermInstanz geöffnet, aber pwdin die letzte Registerkarte der ersten Instanz von iTerm geschrieben
@efr Du hast recht. terminal 1Ich habe die Antwort bearbeitet, um sie zu ändern current terminal. Jetzt sollte der Befehl im aktuellen Fenster ausgeführt werden und nicht im Fenster, das zuerst geöffnet wurde.
Dies funktionierte nicht auf Mac 10.11.6 mit iTerm2. Im Skripteditor werden „Unerwartetes Zeilenende, aber Kennung gefunden“ und „Ende“ hervorgehoben
Dies funktioniert nicht mehr unter macOS 10.14:execution error: System Events got an error: osascript is not allowed to send keystrokes. (1002)
@KernelSanders Sie müssen iterm erlauben, auf das Systemereignis zuzugreifen, indem Sie iTerm in den MacOS-Einstellungen -> Sicherheit -> Eingabehilfen aktivieren
osascript \
-e 'tell application "iTerm" to activate' \
-e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down' \
-e 'tell application "System Events" to tell process "iTerm" to keystroke "ls"' \
-e 'tell application "System Events" to tell process "iTerm" to key code 52'
Ich gehe 148:156: syntax error: Expected end of line but found identifier. (-2741)darauf ein.
was key code 52soll man machen?

Ab mindestens macos Mojave, iTerm 3.2.8, wenn Sie Folgendes ausführen:

$ open -a iTerm .

Es wird es als Registerkarte zum aktuellen Fenster hinzufügen.

kann man damit dann befehle im neuen terminal ausführen?
arbeitete für mich für iTerm mit zsh
Gibt es Möglichkeiten, den auszuführenden Befehl auch zu übergeben?
@sorin Ja, wenn Sie als letztes Argument (statt .in der Antwort) einen Pfad zu einer Binärdatei übergeben, wird diese ausgeführt (nach einer Bestätigungsaufforderung von iTerm)
Danke dir! Wenn ich bereit bin, einen neuen Tab zu erstellen (manchmal möchte ich ein separates Fenster), ist dies bei weitem die einfachste Lösung. Es vermeidet, sich mit einer eigenwilligen Skriptsprache auseinandersetzen zu müssen. (Applescript soll einfach und intuitiv sein, aber die Tatsache, dass es nicht wie jede allgemein verwendete Sprache ist, macht es nicht intuitiv.)

Ich konnte die akzeptierte Antwort nicht zum Laufen bringen. Ich wollte auch mehrere Befehle übergeben. Das habe ich mir ausgedacht.

newtabi(){  
  osascript \
    -e 'tell application "iTerm2" to tell current window to set newWindow to (create tab with default profile)'\
    -e "tell application \"iTerm2\" to tell current session of newWindow to write text \"${@}\""
}

Beispielnutzung

newtabi pwd
newtabi 'cd ~/ && pwd'
newtabi 'echo \"Hello New Tab\"'

Für komplexere Aktionen würde ich empfehlen, die Befehle aufzuteilen.

code_folder="/path/to/code"

alias project="cd ${code_folder}/my-project/foo && yarn run start"

Dann,newtabi project

Können Sie mir bitte sagen, wie ich meinen Strom übergeben kann pwd, damit der Befehl so aussieht: `newtabi '$PWD/foo && Garnlaufstart'?
@ Raj, gute Frage. Ich persönlich unterteile die Befehle in mehr konsumierbare Aliase und/oder Funktionen. Ich habe ein weiteres Beispiel hinzugefügt. Ich hoffe es hilft!
@ Rajnewtabi "$(pwd)/foo && yarn run start"
Dies ist die beste Antwort, sollte am besten bewertet werden

ttabist eine MacOS- und Linux-CLI zum Öffnen eines neuen Terminal-Tabs/Fensters, optional mit einem Befehl zum Ausführen und/oder Anzeigen von Einstellungen

Aus seinen Proben:

# Open a new tab, execute a command, wait for a keypress, and exit.
ttab 'ls "$HOME/Library/Application Support"; echo Press a key to exit.; read -rsn 1; exit'

Falls Sie nach der JXA-Version suchen:

Wiederverwendbare Klasse
class iTerm {
  constructor() {
    this.app = Application("iTerm");
    this.window = this.app.currentWindow();
  }
  findOrCreateTab(tabName, command) {
    this.app.activate();
    let existingTab = this.findTab(tabName);
    if (existingTab == undefined) {
      existingTab = this.createTab(tabName);
      console.log(`Created new tab: ${tabName}`);
      existingTab.currentSession().write({ text: command });
    } else {
      existingTab.select();
      console.log(`Found existing tab: ${tabName}`);
    }
    return existingTab;
  }
  createTab(name) {
    const newTab = this.window.createTabWithDefaultProfile();
    const session = newTab.currentSession();
    session.name = name;
    // console.log(newTab.index());
    // console.log(newSession.name());
    // console.log(newSession.profileName());
    return newTab;
  }
  findTab(name) {
    const tabs = this.window.tabs();
    for (const tab of tabs) {
      let session = tab.currentSession();
      // Strange, but iTerm uses `profileName` instead of `name` for keeping manually assigned session name.
      const tabName = session.profileName();
      if (tabName === name) {
        return tab;
      }
    }
    return undefined;
  }
}

Falls Sie auch daran interessiert sind, wie man ESM-Module in JXA (über Browserify) verwendet, dann ist hier ein gutes Beispiel: https://github.com/johnelm/node-jxa . Plus https://www.npmjs.com/package/esmify .

Nach dem Einrichten können Sie wiederverwendbare Klassen wie unten gezeigt importieren:

import iTerm from "../lib/iTerm";

const app = new iTerm();
app.findOrCreateTab("MyTab", `cd "$HOME"`);