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?
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
- otwiera nowe okno terminala, wykonując określone polecenie. Polecenia z argumentami mogą być zawarte w cudzysłowach, np.
-
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.
- 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.
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.
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...)
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
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.
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/
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).
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