Esecuzione di un comando in una nuova finestra di terminale di Mac OS X.

Ho cercato di capire come eseguire un comando bash in una nuova finestra di Max OS X Terminal.app. Come, ad esempio, ecco come eseguirò il mio comando in un nuovo processo bash:

bash -c "my command here" 

Ma questo riutilizza la finestra del terminale esistente invece di crearne una nuova. Voglio qualcosa come:

 Terminal.app -c "my command here" 

Ma ovviamente questo non funziona. Sono a conoscenza del comando “open -a Terminal.app”, ma non vedo come inoltrare argomenti al terminale, o anche se ho fatto quali argomenti utilizzare.

Grazie!

un modo in cui posso pensare di farlo in cima alla mia testa è creare un file .command ed eseguirlo in questo modo:

 echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command 

o usare il applescript:

 osascript -e 'tell application "Terminal" to do script "echo hello"' 

anche se dovrai sfuggire a un sacco di virgolette o non essere in grado di usare virgolette singole

Soluzione parziale:

Metti le cose che vuoi in uno script di shell, in questo modo

 #!/bin/bash ls echo "yey!" 

E non dimenticare di ” chmod +x file ” per renderlo eseguibile. Allora puoi

 open -a Terminal.app scriptfile 

e verrà eseguito in una nuova finestra. Aggiungi ” bash ” alla fine dello script per impedire l’uscita della nuova sessione. (Anche se potrebbe essere necessario capire come caricare gli utenti file rc e cose ..)

Ho provato a farlo per un po ‘. Ecco uno script che cambia nella stessa directory di lavoro, esegue il comando e chiude la finestra del terminale.

 #!/bin/sh osascript <  

In caso qualcuno se ne frega, ecco un equivalente per iTerm:

 #!/bin/sh osascript <  

Ecco un’altra idea (usando anche AppleScript):

 function newincmd() { declare args # escape single & double quotes args="${@//\'/\'}" args="${args//\"/\\\"}" printf "%s" "${args}" | /usr/bin/pbcopy #printf "%q" "${args}" | /usr/bin/pbcopy /usr/bin/open -a Terminal /usr/bin/osascript -e 'tell application "Terminal" to do script with command "/usr/bin/clear; eval \"$(/usr/bin/pbpaste)\""' return 0 } newincmd ls newincmd echo "hello \" world" newincmd echo $'hello \' world' 

vedi: codesnippets.joyent.com/posts/show/1516

Ecco il mio script fantastico, crea una nuova finestra di terminale, se necessario, e passa alla directory Finder in se Finder è in primo piano. Ha tutti i macchinari necessari per eseguire i comandi.

 on run -- Figure out if we want to do the cd (doIt) -- Figure out what the path is and quote it (myPath) try tell application "Finder" to set doIt to frontmost set myPath to finder_path() if myPath is equal to "" then set doIt to false else set myPath to quote_for_bash(myPath) end if on error set doIt to false end try -- Figure out if we need to open a window -- If Terminal was not running, one will be opened automatically tell application "System Events" to set isRunning to (exists process "Terminal") tell application "Terminal" -- Open a new window if isRunning then do script "" activate -- cd to the path if doIt then -- We need to delay, terminal ignores the second do script otherwise delay 0.3 do script " cd " & myPath in front window end if end tell end run on finder_path() try tell application "Finder" to set the source_folder to (folder of the front window) as alias set thePath to (POSIX path of the source_folder as string) on error -- no open folder windows set thePath to "" end try return thePath end finder_path -- This simply quotes all occurrences of ' and puts the whole thing between 's on quote_for_bash(theString) set oldDelims to AppleScript's text item delimiters set AppleScript's text item delimiters to "'" set the parsedList to every text item of theString set AppleScript's text item delimiters to "'\\''" set theString to the parsedList as string set AppleScript's text item delimiters to oldDelims return "'" & theString & "'" end quote_for_bash 

Ho creato una versione funzione della risposta di Oscar, anche questa copia l’ambiente e passa alla directory appropriata

 function new_window { TMP_FILE=$(mktemp "/tmp/command.XXXXXX") echo "#!/usr/bin/env bash" > $TMP_FILE # Copy over environment (including functions), but filter out readonly stuff set | grep -v "\(BASH_VERSINFO\|EUID\|PPID\|SHELLOPTS\|UID\)" >> $TMP_FILE # Copy over exported envrionment export -p >> $TMP_FILE # Change to directory echo "cd $(pwd)" >> $TMP_FILE # Copy over target command line echo "$@" >> $TMP_FILE chmod +x "$TMP_FILE" open -b com.apple.terminal "$TMP_FILE" sleep .1 # Wait for terminal to start rm "$TMP_FILE" } 

Puoi usarlo in questo modo:

 new_window my command here 

o

 new_window ssh example.com 

Puoi anche richiamare la nuova funzione di comando di Terminal premendo la combinazione di tasti Shift + ⌘ + N Il comando che inserisci nella casella verrà eseguito in una nuova finestra di Terminale.

Io chiamo questo script trun. Suggerisco di metterlo in una directory nel tuo percorso eseguibile. Assicurati che sia eseguibile come questo:

 chmod +x ~/bin/trun 

Quindi puoi eseguire i comandi in una nuova finestra aggiungendo semplicemente trun prima di loro, in questo modo:

 trun tail -f /var/log/system.log 

Ecco la sceneggiatura. Fa alcune cose fantasiose come passare i tuoi argomenti, cambiare la barra del titolo, svuotare lo schermo per rimuovere il clutter di avvio della shell, rimuovere il suo file quando è fatto. Usando un file unico per ogni nuova finestra può essere usato per creare molte windows contemporaneamente.

 #!/bin/bash # make this file executable with chmod +x trun # create a unique file in /tmp trun_cmd=`mktemp` # make it cd back to where we are now echo "cd `pwd`" >$trun_cmd # make the title bar contain the command being run echo 'echo -n -e "\033]0;'$*'\007"' >>$trun_cmd # clear window echo clear >>$trun_cmd # the shell command to execute echo $* >>$trun_cmd # make the command remove itself echo rm $trun_cmd >>$trun_cmd # make the file executable chmod +x $trun_cmd # open it in Terminal to run it in a new Terminal window open -b com.apple.terminal $trun_cmd