Programowo Uruchom Terminal.aplikacja z podanym poleceniem (i niestandardowe kolory)

Mogę uruchomić xterm z linii poleceń (lub programu, poprzez wywołanie systemowe) tak:

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

To uruchomi xterm z niebieskim tekstem i czarnym tłem i uruchomi dowolny skrypt wewnątrz niego.

Moje pytanie: Jak zrobić odpowiednik z terminalem.aplikacja?

Author: dreeves, 2010-12-09

6 answers

Zakładając, że masz już kolory, które chcesz w jednym z profili terminala, oto co wymyśliłem (z Pomocą Juha ' s answer i this Serverfault answer ).


Update:

Po namyśle, myślę, że ta sprawa jest zbyt skomplikowana. Okazuje się, że możesz użyć osascript, aby utworzyć plik wykonywalny AppleScript z linią 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

Zapisz to jako term.scpt, wykonywalny za pomocą chmod +x i użyj go w ten sam sposób jak poniżej, np. term.scpt "emacs -nw" "Red Sands".


Oryginalna odpowiedź:

Zakładając, że zapisujemy poniższy skrypt jako 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 - "$@" > /dev/null

... można wywołać w następujący sposób:

  • term.sh
    • otwiera nowe okno terminala, nic specjalnego
  • term.sh COMMAND
    • otwiera nowe okno terminala, wykonując określone polecenie. Polecenia z argumentami mogą być zawarte w cudzysłowach, np. term.sh "emacs -nw", aby otworzyć nowy terminal i uruchomić emacs
  • term.sh COMMAND PROFILE
    • otwiera nowe okno terminala, wykonując określone polecenie i ustawia je na określony profil. Profile ze spacjami w nazwach mogą być zamknięte w cudzysłowie, np. term.sh "emacs -nw" "Red Sands", aby otworzyć nowy terminal i uruchomić (nie okienkowy) emacs z profilem Red Sands.

Jeśli wywołasz go z błędną nazwą polecenia, nadal otworzy okno i ustaw profil, ale otrzymasz komunikat o błędzie Basha w nowym okno.

Jeśli wywołasz go ze złą nazwą profilu, okno nadal się otworzy i Komenda nadal będzie wykonywana, ale okno będzie trzymać się domyślnego profilu i otrzymasz komunikat o błędzie (do stderr gdziekolwiek go uruchomiłeś) wzdłuż linii

525: 601: execution error: Terminal got an error: Can ' t get settings set 1 whose name = "elvis". Nieprawidłowy indeks. (-1719)

Inwokacja jest nieco chwiejna i prawdopodobnie mogłaby zostać poprawiona, jeśli trochę czasu zajęło nauczenie się getopt (np. coś w rodzaju term.sh -p profile -e command byłoby lepsze i na przykład pozwoliłoby na łatwe otwarcie nowego terminala w określonym profilu bez wywoływania polecenia). I nie zdziwiłbym się też, gdyby były sposoby, aby to spieprzyć ze złożonymi cytatami. Ale to działa do większości celów.

 16
Author: David Moles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-30 20:45:22

Możesz też otworzyć aplikację za pomocą identyfikatora pakietu i podać inne parametry.

Jeśli istnieje skrypt wykonywalny test.sh w bieżącym katalogu następujące polecenie otworzy go i uruchomi w Terminalu.app

 open -b com.apple.terminal test.sh 

Jedyną wadą, którą mogę znaleźć, jest to, że Terminal nie wydaje się dziedziczyć obecnego środowiska, więc będziesz musiał zorganizować inny sposób przekazywania parametrów do skryptu, który chcesz uruchomić. Myślę, że budowanie skryptu w locie, aby osadzić parametry byłoby to jedno podejście (oczywiście biorąc pod uwagę konsekwencje dla bezpieczeństwa...)

 22
Author: Sam Deane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 11:29:17

Prawie wszystkie (każdy?) program osx można uruchomić z linii poleceń używając:

Nazwa aplikacji.app / Contents / MacOS / command

Dla terminala polecenie to:

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

Możesz użyć autouzupełniania (tab) lub ls, aby znaleźć poprawne nazwy plików. ".aplikacja " to w zasadzie folder.

Aby zmienić kolory i uruchomić skrypt... Myślę, że nie można tego zrobić ze skryptami powłoki, ponieważ Terminal nie akceptuje argumentów ("Terminal myScript.sh " nie uruchamia myScript). Z iTerm to działa.

Obejście polega na użyciu applescriptu (zawiniętego w skrypt powłoki):

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

Ok, teraz powinien zachowywać się dokładnie tak samo jak przykład xterm. Wadą jest ciągłe sprawdzanie identyfikatorów okien (czyli złe programowanie).

Edit: nieco bardziej elegancki applescript użyłby właściwości 'busy' terminala. Zostawiam oryginalny kod tak jak działa dla ogólnego programu (nie tylko terminala).

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

Również dla idealnie poprawnego programu, należy sprawdzić, czy terminal jest uruchomiony, czy nie. Wpływa na liczbę otwartych okien. Tak, to powinno być uruchomione najpierw (znowu paskudnie wyglądający hack, że będę edytować później jak znajdę Działa rozwiązanie).

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

Br,
Juha

 14
Author: Juha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-22 11:14:52

Możesz również przejść do terminala GUI, całkowicie skonfigurować opcje do zawartości twojego serca i wyeksportować je do ".terminal " plik i / lub grupuje konfiguracje w grupę okien i eksportuje je do pliku terminala "myGroup.terminal". Then

Otwórz myGroup.terminal

Otworzy terminal(y) na raz, ze wszystkimi ustawieniami i poleceniami startowymi skonfigurowanymi.

 4
Author: jerseyboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 00:09:21

Możesz uruchomić terminal za pomocą następującego polecenia, nie wiesz jak określić kolory:

 open /Applications/Utilities/Terminal.app/
 1
Author: jhuebsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-10 00:21:23

ODPOWIEDŹ z @david-moles powyżej działa, ale Uruchom terminal i polecenie w ~ raczej bieżącym katalogu roboczym, w którym term został uruchomiony. Ta odmiana dodaje polecenie cd.

#!/usr/bin/env bash
# based on answer by @david-moles in 
# https://stackoverflow.com/questions/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 - "$@" > /dev/null

Może być sposób, aby ustawić PWD za pomocą applescript.

Notatka: kiedy używam tego, czasami dwa okna terminala, jeden powłoka uruchomiona w ~ i drugi, który uruchamia polecenie cd i polecenie z argv[1]. Wydaje się, że dzieje się tak, jeśli Terminal nie jest jeszcze uruchomiony; być może otwiera stary stan (nawet jeśli nie miałem otwartych terminali, gdy go zamknąłem).

 1
Author: djb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 04:38:19