откройте новую вкладку в iTerm и выполните там команду

Я нашел способ открыть новую вкладку в iTerm:

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

И я хочу выполнить некоторые команды в новой вкладке. Пусть это будет простая команда pwd. Как это сделать?

Если я побегу...

newtabi && pwd

Новая вкладка открывается как положено, но pwdкоманда выполняется не в новой вкладке, а в старой, где я набралnewtabi && pwd

я использую zsh. Моя ОСOS X 10.8.5

Этому вопросу 8 лет, и принятый ответ далек от идеала. Я все еще надеюсь увидеть передачу некоторых аргументов open -a iTermдля запуска команды.

Ответы (6)

Использование 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"
если открыто более одного iTerms, он открывает новую вкладку в правильном iTermэкземпляре, но пишет pwdв последней вкладке первого экземпляра iTerm
@efr Ты прав. Я отредактировал ответ, чтобы изменить terminal 1его на current terminal. Теперь он должен запускать команду в текущем окне, а не в окне, которое было открыто первым.
Это не работало на Mac 10.11.6 с iTerm2. В редакторе скриптов выделены "Неожиданный конец строки, но найден идентификатор" и "терминал"
Это больше не работает в macOS 10.14:execution error: System Events got an error: osascript is not allowed to send keystrokes. (1002)
@KernelSanders Вам нужно разрешить iterm доступ к системному событию, проверив iTerm в настройках MacOS -> Безопасность -> Специальные возможности.
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'
Я берусь 148:156: syntax error: Expected end of line but found identifier. (-2741)за это.
что key code 52должен делать?

По крайней мере, для MacOS Mojave, iTerm 3.2.8, если вы запустите:

$ open -a iTerm .

Он добавит его как вкладку в текущее окно.

можете ли вы затем выполнять команды в новом терминале с этим?
работал у меня для iTerm с zsh
Любые способы также передать команду для выполнения?
@sorin Да, если вы передадите путь к двоичному файлу в качестве последнего аргумента (а не .в ответе), он выполнит его (после запроса подтверждения от iTerm)
Спасибо! Когда я хочу создать новую вкладку (иногда мне нужно отдельное окно), это, безусловно, самое простое решение. Это позволяет избежать необходимости иметь дело с идиосинкразическим языком сценариев. (Applescript должен быть простым и интуитивно понятным, но тот факт, что он не похож ни на один широко используемый язык, делает его неинтуитивным.)

Я не мог получить принятый ответ на работу. Я также хотел передать несколько команд. Это то, что я придумал.

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

Пример использования

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

Для более сложных действий я бы рекомендовал разбивать команды.

code_folder="/path/to/code"

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

Затем,newtabi project

Не могли бы вы рассказать мне, как я могу передать свой ток pwd, чтобы команда выглядела так: `newtabi '$PWD/foo && yarn run start'?
@Рай, хороший вопрос. Лично я разбиваю команды на более удобные псевдонимы и/или функции. Я добавил еще один пример. Надеюсь, это поможет!
@Раджnewtabi "$(pwd)/foo && yarn run start"
это лучший ответ, он должен получить наивысший рейтинг

ttabэто интерфейс командной строки для macOS и Linux для открытия новой вкладки/окна терминала, опционально с командой для выполнения и/или отображения настроек

Из его образцов:

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

Если вы ищете версию JXA:

Многоразовый класс
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;
  }
}

Если вам также интересно, как использовать модули ESM в JXA (через браузер), то вот хороший пример: https://github.com/johnelm/node-jxa . Плюс https://www.npmjs.com/package/esmify .

После настройки вы можете импортировать повторно используемый класс, как показано ниже:

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

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