Question Exécution d'une commande dans une nouvelle fenêtre du terminal Mac OS X


J'ai essayé de comprendre comment exécuter une commande bash dans une nouvelle fenêtre Max OS X Terminal.app. Comme exemple, voici comment je voudrais 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 d'en créer une nouvelle. Je veux quelque chose comme:

Terminal.app -c "my command here"

Mais bien sûr, cela ne fonctionne pas. Je suis au courant de la commande "open -a Terminal.app", mais je ne vois pas comment transmettre les arguments au terminal, ou même si je faisais les arguments à utiliser.

Merci!


71
2018-06-12 22:26


origine


Réponses:


Une façon de penser est de créer un fichier .command et de l'exécuter ainsi:

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

ou utilisez le script:

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

bien que vous deviez soit échapper à beaucoup de guillemets doubles ou ne pas pouvoir utiliser des guillemets simples


64
2018-06-12 22:28



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. Ajouter 'bash'à la fin du script pour empêcher la nouvelle session de sortir. (Bien que vous deviez peut-être trouver comment charger les fichiers-rc des utilisateurs et d'autres choses ..)


52
2018-06-12 23:03



J'ai essayé de faire ça pendant un moment. Voici un script qui passe au 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

27
2018-05-21 02:34



Dans le cas où quelqu'un se soucie, 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

7
2017-10-23 15:00



Voici encore une autre prise (en utilisant AppleScript aussi):

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


2
2018-06-14 08:47



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 Finder si le Finder 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

2
2018-05-08 14:12



J'ai fait une version fonctionnelle de la réponse d'Oscar, celle-ci copie également l'environnement et passe 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

2
2018-04-21 14:51