Подтвердить что ты не робот

Программно запускайте Terminal.app с указанной командой (и пользовательскими цветами)

Я могу запустить xterm из командной строки (или программы с помощью системного вызова):

/usr/X11/bin/xterm -fg SkyBlue -bg black -e myscript

Это запустит xterm с синим текстом и черным фоном и запустит в нем произвольный script.

Мой вопрос: как мне сделать эквивалент с Terminal.app?

4b9b3361

Ответ 1

Предполагая, что у вас уже есть цвета, которые вы хотите в одном из профилей терминалов, вот что я придумал (с некоторой помощью от ответа Juha и от этого ответа Serverfault).


Обновить:

По размышлению, я думаю, что этот echo бизнес слишком сложный. Оказывается, вы можете использовать osascript для создания исполняемого файла AppleScript со строкой shebang:

#!/usr/bin/osascript                                                                            

on run argv                                                                                     
  if length of argv is equal to 0                                                               
    set command to ""                                                                           
  else                                                                                          
    set command to item 1 of argv                                                               
  end if                                                                                        

  if length of argv is greater than 1                                                           
    set profile to item 2 of argv                                                               
    runWithProfile(command, profile)                                                            
  else                                                                                          
    runSimple(command)                                                                          
  end if                                                                                        
end run                                                                                         

on runSimple(command)                                                                           
  tell application "Terminal"                                                                   
    activate                                                                                    
    set newTab to do script(command)                                                            
  end tell                                                                                      
  return newTab                                                                                 
end runSimple                                                                                   

on runWithProfile(command, profile)                                                             
  set newTab to runSimple(command)                                                              
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)                                                                                      
end runWithProfile

Сохраните это как term.scpt, сделайте его исполняемым с помощью chmod +x и используйте его так же, как term.scpt "emacs -nw" "Red Sands" ниже, например term.scpt "emacs -nw" "Red Sands".


Оригинальный ответ:

Предполагая, что мы сохраним сценарий ниже как term.sh...

#!/bin/sh

echo '
on run argv
  if length of argv is equal to 0
    set command to ""
  else
    set command to item 1 of argv
  end if

  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application "Terminal"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
' | osascript - "[email protected]" > /dev/null

... его можно вызвать следующим образом:

  • term.sh
    • открывает новое окно терминала, ничего особенного
  • term.sh COMMAND
    • открывает новое окно терминала, выполняя указанную команду. Команды с аргументами могут быть заключены в кавычки, например term.sh "emacs -nw" чтобы открыть новый терминал и запустить (без окон) emacs
  • term.sh COMMAND PROFILE
    • открывает новое окно терминала, выполняет указанную команду и устанавливает ее в указанный профиль. Профили с пробелами в именах могут быть заключены в кавычки, например term.sh "emacs -nw" "Red Sands" чтобы открыть новый терминал и запустить (без окон) emacs с профилем Red Sands.

Если вы вызовете его с неправильным именем команды, он все равно откроет окно и настроит профиль, но вы получите сообщение об ошибке bash в новом окне.

Если вы вызываете его с неправильным именем профиля, окно все равно будет открыто, и команда все равно будет выполняться, но окно будет придерживаться профиля по умолчанию, и вы получите сообщение об ошибке (в stderr, где бы вы его не запустили) в соответствии с

525: 601: ошибка выполнения: терминал получил ошибку: не удалось установить настройки 1, чье имя = "Элвис". Недопустимый индекс. (-1719)

Вызов немного взломан и может быть улучшен, если я term.sh -p profile -e command время на изучение getopt (например, что-то вроде команды term.sh -p profile -e command будет лучше и, например, позволит вам легко открыть новый терминал в указанном профиле без вызова команды). И я также не удивлюсь, если есть способы привить его сложным цитированием. Но это работает для большинства целей.

Ответ 2

Вы также можете открыть приложение с помощью идентификатора пакета и указать другие параметры.

Если в текущем каталоге есть исполняемый файл script test.sh, откроется и запустит следующую команду в Terminal.app

 open -b com.apple.terminal test.sh 

Единственная нижняя сторона, которую я могу найти, заключается в том, что терминал не наследует вашу текущую среду, поэтому вам придется организовать другой способ передачи параметров через script, который вы хотите запустить. Я предполагаю, что создание script "на лету" для внедрения параметров будет одним из подходов (с учетом последствий безопасности, конечно...)

Ответ 3

Почти вся (каждая?) программа osx может быть запущена из командной строки, используя:

appName.app/Contents/MacOS/command

Для терминала команда:

/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal

Вы можете использовать автозаполнение (вкладка) или ls, чтобы найти правильные имена файлов. ".app" - это в основном папка.

Чтобы изменить цвета и запустить script... Я думаю, вы не можете сделать это со сценариями оболочки, поскольку Терминал не принимает аргументы ( "Terminal myScript.sh" не запускает myScript). С iTerm это работает.

Временное решение - использовать applescript (завернутый в оболочку script):

   #!/bin/sh
   osascript -e '
     tell application "Terminal"
       activate
       tell window 1
          do script "sleep 5; exit"
          set background color to {0, 11111, 11111}
          set win_id to id
       end tell

       set w_ids to (id of every window)

       repeat while w_ids contains win_id
         delay 1
         set w_ids to (id of every window)
       end repeat
    end tell'

Хорошо, теперь он должен вести себя точно так же, как пример xterm. Недостатком является постоянный опрос идентификаторов окон (что плохое программирование).

edit: Немного более элегантный applescript будет использовать свойство "занято" терминала. Я оставлю исходный код, как работает для общей программы (а не только для терминала).

tell application "Terminal"
    tell window 1
        do script "sleep 2"
        set background color to {0, 11111, 11111}
        repeat while busy
            delay 1
        end repeat
        close
    end tell
end tell

Также для совершенно правильной программы необходимо проверить, работает ли терминал или нет. Это влияет на количество открытых окон. Итак, это должно быть выполнено сначала (опять-таки неприятный вид взлома, который я буду редактировать позже, когда найду рабочее решение).

tell application "System Events"
    if (count (processes whose name is "Terminal")) is 0 then
        tell application "Terminal"
            tell window 1
                close
            end tell
        end tell
    end if
end tell

ш,
Юха

Ответ 4

Вы также можете зайти в графический интерфейс терминала, полностью настроить параметры своего сердечного контента и экспортировать их в файл ".terminal" и/или сгруппировать конфигурации в группу окон и экспортировать их в файл терминала "myGroup".Терминал". Тогда

откройте myGroup.terminal

откроет терминал сразу, со всеми вашими настройками и командами запуска в соответствии с настройками.

Ответ 5

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

 open /Applications/Utilities/Terminal.app/

Ответ 6

Ответ от @david-moles выше работает, но запустите терминал и команду в ~ скорее в текущем рабочем каталоге, где был запущен термин. Этот вариант добавляет команду cd.

#!/usr/bin/env bash
# based on answer by @david-moles in 
# https://stackoverflow.com/info/4404242/programmatically-launch-terminal-app-with-a-specified-command-and-custom-colors
echo "
on run argv
  if length of argv is equal to 0
    set command to \"\"
  else
    set command to item 1 of argv
  end if
  set command to \"cd '"$PWD"' ;\" & command
  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application \"Terminal\"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application \"Terminal\" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
" | osascript - "[email protected]" > /dev/null

Может быть способ установить PWD с помощью applescript.

Примечание. Когда я использую это, я иногда два окна терминала, один из которых работает в ~ и секунду, который запускает команду cd и команду из argv [1]. Кажется, произойдет, если терминал еще не запущен; возможно, это открытие старого состояния (даже если у меня не было открытых терминалов, когда я его закрыл).