J'ai essayé de comprendre comment exécuter une commande bash dans une nouvelle fenêtre Max OS X Terminal.app. En tant qu'exemple, voici comment exécuter ma commande dans un nouveau processus bash:
bash -c "my command here"
Mais cela réutilise la fenêtre de terminal existante au lieu de créer une nouvelle. Je veux quelque chose comme:
Terminal.app -c "my command here"
Mais bien sûr ça ne marche pas. Je connais la commande "open -a Terminal.app", mais je ne vois pas comment transférer des arguments vers le terminal, ni même si je connaissais les arguments à utiliser.
une façon dont je peux penser de le faire par cœur consiste à créer un fichier .command et à l'exécuter comme suit:
echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command
ou utilisez applescript:
osascript -e 'tell application "Terminal" to do script "echo hello"'
bien que vous deviez soit échapper à beaucoup de guillemets doubles, soit ne pas être en mesure d'utiliser des guillemets simples
Solution partielle:
Mettez les choses que vous voulez faire dans un script Shell, comme ça
#!/bin/bash
ls
echo "yey!"
Et n'oubliez pas de 'chmod +x file
'pour le rendre exécutable. Ensuite vous pouvez
open -a Terminal.app scriptfile
et il fonctionnera dans une nouvelle fenêtre. Ajoutez 'bash
' à la fin du script pour empêcher la sortie de la nouvelle session. (Bien que vous deviez peut-être comprendre comment charger les fichiers rc des utilisateurs, etc.)
J'essaie de faire ça depuis un moment. Voici un script qui modifie le même répertoire de travail, exécute la commande et ferme la fenêtre du terminal.
#!/bin/sh
osascript <<END
tell application "Terminal"
do script "cd \"`pwd`\";$1;exit"
end tell
END
Si cela vous intéresse, voici un équivalent pour iTerm:
#!/bin/sh
osascript <<END
tell application "iTerm"
tell the first terminal
launch session "Default Session"
tell the last session
write text "cd \"`pwd`\";$1;exit"
end tell
end tell
end tell
END
J'ai créé une version de fonction de la réponse d'Oscar, celle-ci copie également l'environnement et les modifications apportées au répertoire approprié
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"
}
Vous pouvez l'utiliser comme ceci:
new_window my command here
ou
new_window ssh example.com
Voici encore une autre prise à ce sujet (utilisant également 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'
voir: codesnippets.joyent.com/posts/show/1516
Voici mon script génial, il crée une nouvelle fenêtre de terminal si nécessaire et bascule vers le répertoire dans lequel se trouve le Finder, si celui-ci est au premier plan. Il a toutes les machines dont vous avez besoin pour exécuter des commandes.
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
Vous pouvez également appeler la fonction nouvelle commande de Terminal en appuyant sur la touche Shift + ⌘ + N
combinaison de touches. La commande que vous avez insérée dans la boîte sera exécutée dans une nouvelle fenêtre de terminal.