abra una nueva pestaña en iTerm y ejecute el comando allí

He encontrado la manera de abrir una nueva pestaña en iTerm:

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

Y quiero ejecutar algunos comandos en una nueva pestaña. Que sea un comando simple pwd. ¿Cómo hacerlo?

Si corro...

newtabi && pwd

La nueva pestaña se abre como se esperaba, pero pwdel comando no se ejecuta en la nueva pestaña sino en la anterior, donde escribínewtabi && pwd

zshyo uso mi sistema operativo esOS X 10.8.5

Esa pregunta tiene 8 años y la respuesta aceptada está lejos de ser ideal. Todavía espero ver pasar algunos argumentos open -a iTermpara ejecutar un comando.

Respuestas (6)

Uso 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"
si abrió más de uno iTerms, abre una nueva pestaña en la instancia correcta iTerm, pero escribe pwden la última pestaña de la primera instancia de iTerm
@efr Tienes razón. Edité la respuesta para cambiar terminal 1a current terminal. Ahora debería ejecutar el comando en la ventana actual en lugar de la ventana que se abrió primero.
Esto no funcionó en mac 10.11.6 con iTerm2. En el editor de secuencias de comandos, "Final de línea inesperado pero identificador encontrado" y "terminal" están resaltados
Esto ya no funciona en macOS 10.14:execution error: System Events got an error: osascript is not allowed to send keystrokes. (1002)
@KernelSanders Debe permitir que iterm acceda al evento del sistema al verificar iTerm en Configuración de MacOS -> Seguridad -> Accesibilidad
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'
Me estoy poniendo 148:156: syntax error: Expected end of line but found identifier. (-2741)en esto.
¿Qué se key code 52supone que debe hacer?

A partir de al menos macos Mojave, iTerm 3.2.8, si ejecuta:

$ open -a iTerm .

Lo agregará como una pestaña a la ventana actual.

¿Puedes ejecutar comandos en la nueva terminal con esto?
funcionó para mí para iTerm con zsh
¿Alguna forma de pasar también el comando para ejecutar?
@sorin Sí, si pasa una ruta a un binario como argumento final (en lugar de .en la respuesta), lo ejecutará (después de un mensaje de confirmación de iTerm)
¡Gracias! Cuando estoy dispuesto a crear una nueva pestaña (a veces quiero una ventana separada), esta es, de lejos, la solución más fácil. Evita tener que lidiar con un lenguaje de secuencias de comandos idiosincrásico. (Se supone que Applescript es fácil e intuitivo, pero el hecho de que no se parezca a ningún lenguaje de uso común hace que no sea intuitivo).

No pude obtener la respuesta aceptada para trabajar. También quería pasar varios comandos. Esto es lo que se me ocurrió.

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 \"${@}\""
}

Ejemplo de uso

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

Para acciones más complejas, recomendaría dividir los comandos.

code_folder="/path/to/code"

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

Después,newtabi project

¿Puede decirme cómo puedo pasar mi corriente pwdpara que el comando se vea así: `newtabi '$PWD/foo && yarn run start'?
@Raj, buena pregunta. Personalmente divido los comandos en alias y/o funciones más consumibles. Agregué otro ejemplo. ¡Espero eso ayude!
@Rajnewtabi "$(pwd)/foo && yarn run start"
esta es la mejor respuesta, debería ser la mejor calificada

ttabes una CLI de macOS y Linux para abrir una nueva pestaña/ventana de terminal, opcionalmente con un comando para ejecutar y/o mostrar la configuración

De sus muestras:

# 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'

En caso de que esté buscando la versión JXA:

clase reutilizable
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;
  }
}

En caso de que también esté interesado en cómo usar los módulos ESM en JXA (a través de browserify), aquí hay un buen ejemplo: https://github.com/johnelm/node-jxa . Además , https://www.npmjs.com/package/esmify .

Después de la configuración, puede importar una clase reutilizable como se muestra a continuación:

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

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