Ouvrir un nouvel onglet Terminal depuis la ligne de commande (Mac OS X)

Est-il possible d’ouvrir un nouvel onglet dans le terminal de Mac OS X à partir de la ligne de commande dans un onglet actuellement ouvert?

Je sais que le raccourci clavier pour ouvrir un nouvel onglet dans Terminal est “CMD + t” mais je recherche une solution basée sur un script exécutée dans la ligne de commande.

Essaye ça:

osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' 

Mise à jour : Cette réponse a gagné en popularité en fonction de la fonction shell affichée ci-dessous, qui fonctionne toujours à partir d’OSX 10.10 (à l’exception de l’option -g ).
Cependant, une version de script plus complète, plus robuste et testée est désormais disponible dans le registre npm sous le nom de CLI ttab , qui prend également en charge iTerm2 :

  • Si vous avez installé Node.js , exécutez simplement:

     npm install -g ttab 

    (selon la façon dont vous avez installé Node.js, vous devrez peut-être append Sudo).

  • Sinon, suivez ces instructions .

  • Une fois installé, exécutez ttab -h pour obtenir des informations d’utilisation concises ou man ttab pour afficher le manuel.


Sur la base de la réponse acceptée, vous trouverez ci-dessous une fonction pratique de bash pour ouvrir un nouvel onglet dans la fenêtre Terminal actuelle et éventuellement exécuter une commande (en prime, il existe une variante pour créer une nouvelle fenêtre ).

Si une commande est spécifiée, son premier jeton sera utilisé comme titre du nouvel onglet.

Exemples d’invocations:

  # Get command-line help. newtab -h # Simpy open new tab. newtab # Open new tab and execute command (quoted parameters are supported). newtab ls -l "$Home/Library/Application Support" # Open a new tab with a given working directory and execute a command; # Double-quote the command passed to `eval` and use backslash-escaping inside. newtab eval "cd ~/Library/Application\ Support; ls" # Open new tab, execute commands, close tab. newtab eval "ls \$HOME/Library/Application\ Support; echo Press a key to exit.; read -s -n 1; exit" # Open new tab and execute script. newtab /path/to/someScript # Open new tab, execute script, close tab. newtab exec /path/to/someScript # Open new tab and execute script, but don't activate the new tab. newtab -G /path/to/someScript 

CAVEAT : Lorsque vous exécutez newtab (ou newwin ) à partir d’un script, le dossier de travail initial du script sera le dossier de travail dans le nouvel onglet / fenêtre, même si vous modifiez le dossier de travail avant d’ appeler newtab / newwin – pass eval with une commande cd en guise de solution de contournement (voir exemple ci-dessus).

Code source (collez dans votre profil bash, par exemple):

 # Opens a new tab in the current Terminal window and optionally executes a command. # When invoked via a function named 'newwin', opens a new Terminal *window* instead. function newtab { # If this function was invoked directly by a function named 'newwin', we open a new *window* instead # of a new tab in the existing window. local funcName=$FUNCNAME local targetType='tab' local targetDesc='new tab in the active Terminal window' local makeTab=1 case "${FUNCNAME[1]}" in newwin) makeTab=0 funcName=${FUNCNAME[1]} targetType='window' targetDesc='new Terminal window' ;; esac # Command-line help. if [[ "$1" == '--help' || "$1" == '-h' ]]; then cat < &2 && return 2 ;; *) # 1st argument reached; proceed with argument-parameter analysis below. break ;; esac shift done # All remaining parameters, if any, make up the command to execute in the new tab/window. local CMD_PREFIX='tell application "Terminal" to do script' # Command for opening a new Terminal window (with a single, new tab). local CMD_NEWWIN=$CMD_PREFIX # Curiously, simply executing 'do script' with no further arguments opens a new *window*. # Commands for opening a new tab in the current Terminal window. # Sadly, there is no direct way to open a new tab in an existing window, so we must activate Terminal first, then send a keyboard shortcut. local CMD_ACTIVATE='tell application "Terminal" to activate' local CMD_NEWTAB='tell application "System Events" to keystroke "t" using {command down}' # For use with -g: commands for saving and restoring the previous application local CMD_SAVE_ACTIVE_APPNAME='tell application "System Events" to set prevAppName to displayed name of first process whose frontmost is true' local CMD_REACTIVATE_PREV_APP='activate application prevAppName' # For use with -G: commands for saving and restoring the previous state within Terminal local CMD_SAVE_ACTIVE_WIN='tell application "Terminal" to set prevWin to front window' local CMD_REACTIVATE_PREV_WIN='set frontmost of prevWin to true' local CMD_SAVE_ACTIVE_TAB='tell application "Terminal" to set prevTab to (selected tab of front window)' local CMD_REACTIVATE_PREV_TAB='tell application "Terminal" to set selected of prevTab to true' if (( $# )); then # Command specified; open a new tab or window, then execute command. # Use the command's first token as the tab title. local tabTitle=$1 case "$tabTitle" in exec|eval) # Use following token instead, if the 1st one is 'eval' or 'exec'. tabTitle=$(echo "$2" | awk '{ print $1 }') ;; cd) # Use last path component of following token instead, if the 1st one is 'cd' tabTitle=$(basename "$2") ;; esac local CMD_SETTITLE="tell application \"Terminal\" to set custom title of front window to \"$tabTitle\"" # The sortingcky part is to quote the command tokens properly when passing them to AppleScript: # Step 1: Quote all parameters (as needed) using printf '%q' - this will perform backslash-escaping. local quotedArgs=$(printf '%q ' "$@") # Step 2: Escape all backslashes again (by doubling them), because AppleScript expects that. local cmd="$CMD_PREFIX \"${quotedArgs//\\/\\\\}\"" # Open new tab or window, execute command, and assign tab title. # '>/dev/null' suppresses AppleScript's output when it creates a new tab. if (( makeTab )); then if (( inBackground )); then # !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application. if (( inBackground == 2 )); then # Restore the previously active tab after creating the new one. osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_SAVE_ACTIVE_TAB" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_APP" -e "$CMD_REACTIVATE_PREV_TAB" >/dev/null else osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_APP" >/dev/null fi else osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" >/dev/null fi else # make *window* # Note: $CMD_NEWWIN is not needed, as $cmd implicitly creates a new window. if (( inBackground )); then # !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application. if (( inBackground == 2 )); then # Restore the previously active window after creating the new one. osascript -e "$CMD_SAVE_ACTIVE_WIN" -e "$cmd" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_WIN" >/dev/null else osascript -e "$cmd" -e "$CMD_SETTITLE" >/dev/null fi else # Note: Even though we do not ssortingctly need to activate Terminal first, we do it, as assigning the custom title to the 'front window' would otherwise sometimes target the wrong window. osascript -e "$CMD_ACTIVATE" -e "$cmd" -e "$CMD_SETTITLE" >/dev/null fi fi else # No command specified; simply open a new tab or window. if (( makeTab )); then if (( inBackground )); then # !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application. if (( inBackground == 2 )); then # Restore the previously active tab after creating the new one. osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_SAVE_ACTIVE_TAB" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$CMD_REACTIVATE_PREV_APP" -e "$CMD_REACTIVATE_PREV_TAB" >/dev/null else osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$CMD_REACTIVATE_PREV_APP" >/dev/null fi else osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" >/dev/null fi else # make *window* if (( inBackground )); then # !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application. if (( inBackground == 2 )); then # Restore the previously active window after creating the new one. osascript -e "$CMD_SAVE_ACTIVE_WIN" -e "$CMD_NEWWIN" -e "$CMD_REACTIVATE_PREV_WIN" >/dev/null else osascript -e "$CMD_NEWWIN" >/dev/null fi else # Note: Even though we do not ssortingctly need to activate Terminal first, we do it so as to better visualize what is happening (the new window will appear stacked on top of an existing one). osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWWIN" >/dev/null fi fi fi } # Opens a new Terminal window and optionally executes a command. function newwin { newtab "$@" # Simply pass through to 'newtab', which will examine the call stack to see how it was invoked. } 

Voici comment cela se fait par bash_it :

 function tab() { osascript 2>/dev/null <  

Après avoir ajouté ceci à votre fichier .bash_profile, vous utiliseriez la commande tab pour ouvrir le répertoire de travail actuel dans un nouvel onglet.

Voir: https://github.com/revans/bash-it/blob/master/plugins/available/osx.plugin.bash#L3

 osascript -e 'tell app "Terminal" do script "echo hello" end tell' 

Cela ouvre un nouveau terminal et exécute la commande “echo hello” à l’intérieur.

Si vous utilisez oh-my-zsh (que tout geek branché devrait utiliser), après avoir activé le plug-in “osx” dans .zshrc , entrez simplement la commande tab ; il ouvrira un nouvel onglet et cd dans le répertoire où vous vous trouviez.

Je les ai ajoutés à mon fichier .bash_profile pour pouvoir accéder à tabname et newtab

 tabname() { printf "\e]1;$1\a" } new_tab() { TAB_NAME=$1 COMMAND=$2 osascript \ -e "tell application \"Terminal\"" \ -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \ -e "do script \"printf '\\\e]1;$TAB_NAME\\\a'; $COMMAND\" in front window" \ -e "end tell" > /dev/null } 

Donc, lorsque vous êtes sur un onglet particulier, vous pouvez simplement taper

 tabname "New TabName" 

pour organiser tous les tabs ouverts que vous avez. C’est beaucoup mieux que d’obtenir des informations sur l’onglet et de les modifier.

Le raccourci clavier cmd-t ouvre un nouvel onglet afin que vous puissiez transmettre cette séquence de touches à la commande OSA comme suit:

osascript -e 'tell application "System Events"' -e 'keystroke "t" using command down' -e 'end tell'

lorsque vous êtes dans une fenêtre de terminal, la commande + n => ouvre un nouveau terminal et la commande + t => ouvre un nouvel onglet dans la fenêtre de terminal actuelle

Si vous utilisez iTerm, cette commande ouvre un nouvel onglet:

 osascript -e 'tell application "iTerm" to activate' -e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down' 

Qu’en est-il de cet extrait simple, basé sur une commande de script standard (echo):

 # set mac osx's terminal title to "My Title" echo -n -e "\033]0;My Title\007" 

Avec X installé (par exemple à partir de homebrew ou Quartz), un simple “xterm &” fait (presque) le tour, il ouvre une nouvelle fenêtre de terminal (pas un onglet, cependant).