8 votes

Comment ouvrir un nouvel onglet de terminal dans le répertoire de travail actuel ?

Je veux créer et exécuter un bash fonction qui :

  1. cd dans le répertoire d'un projet
  2. Ouvrez un nouvel onglet dans Terminal dans le même répertoire.
  3. Ouvrir mes outils de développement et lancer les services de développement

L'élément #2 ne fonctionne pas comme prévu, le nouvel onglet ne change pas de répertoire.

Voici le script (les deux fonctions résidant dans mon .bashrc fichier :

# Open a new tab (needs a path as an argument)
new_terminal_tab(){
    osascript -e "tell application \"Terminal\"" \
                        -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
                        -e "do script \"cd $1; clear;\" in front window" \
                        -e "end tell"
                        > /dev/null
}

# Set up workspace
affiliatesForm(){
    # cd into the project's directory
    cd /Users/iamuser/Documents/path/to/project\ file
    # Get the working directory
    pwd=`pwd`

    # Open a new tab in Terminal and cd into project's directory
    # The idea is to have a tab with Rails server output, and another tab in the project's directory
    new_terminal_tab $pwd

    # Open the project in Sublime Text 2
    subl $pwd

    # Start the Rails server
    rails server
}

Qu'est-ce que je fais de mal ? Que fait ce code que je ne connais pas ?


Mise à jour

Le chemin du répertoire auquel j'essaie d'accéder comporte des espaces. Mais l'échappement de l'espace ne m'aide pas du tout. Le script fonctionne avec des chemins qui ne comportent pas d'espaces.

18voto

grg Points 181593

L'ouverture d'un nouvel onglet dans le Terminal devrait par défaut conserver le répertoire actuel. Si ce n'est pas le cas, vous avez peut-être cassé la $PROMPT_COMMAND .

Rappelez-vous également de ne pas remplacer la valeur précédente si vous avez l'intention d'ajouter un comportement personnalisé en ajoutant ; $PROMPT_COMMAND à la fin.

PROMPT_COMMAND="my_custom_function; $PROMPT_COMMAND"

Pour référence, voici la valeur par défaut de /etc/bashrc (OS X 10.9) :

# Tell the terminal about the working directory at each prompt.
if [ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]; then
    update_terminal_cwd() {
        # Identify the directory using a "file:" scheme URL,
        # including the host name to disambiguate local vs.
        # remote connections. Percent-escape spaces.
        local SEARCH=' '
        local REPLACE='%20'
        local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
        printf '\e]7;%s\a' "$PWD_URL"
    }
    PROMPT_COMMAND="update_terminal_cwd; $PROMPT_COMMAND"
fi

7voto

rossarian Points 61

Je sais que cette question date un peu, mais je viens de trouver une réponse qui pourrait être utile aux utilisateurs d'iTerm2 sous Mac OS X.

Sous l'onglet "profil" des préférences d'iTerm2, vous pouvez définir l'endroit exact où iterm ouvre de nouveaux onglets sous la rubrique "Répertoire de travail".

iterm preferences

Après cela, fermez et redémarrez iTerm et vous devriez être prêt à partir !

1voto

Maitus Points 161

Donc, comme il a été mentionné, mon script fonctionnait avec des chemins qui ne comprenaient pas d'espaces. Il s'avère que la solution réside dans l'enveloppement de la variable (à l'intérieur de new_terminal_tab() ) entre guillemets simples comme ceci :

-e "do script \"cd '$1'; clear;\" in front window" \

C'est incroyable ce que les citations peuvent faire, n'est-ce pas ?

0voto

hyuan Points 609

J'utilise une application appelée go2shell. Elle vous donne un petit bouton sur le Finder qui ouvre le répertoire courant dans un terminal.

https://itunes.apple.com/es/app/go2shell/id445770608?mt=12

Vous pouvez également utiliser le terminal pour accéder au dossier que vous voulez, et utiliser 'open .'.

0voto

Saaru Lindestøkke Points 5124

Le service fourni aquí fonctionne pour moi. Il ouvre un nouvel onglet de terminal dans le dossier à partir duquel j'ai lancé le service.

J'ai rencontré le problème suivant : lorsque j'avais déjà une fenêtre de terminal ouverte, une nouvelle fenêtre s'ouvrait. J'ai résolu le problème comme suit :

on run {input, parameters}
    repeat with this_item in input
        set the_path to POSIX path of this_item
        repeat until the_path ends with "/"
            set the_path to text 1 thru -2 of the_path
        end repeat

        set numberOfWindows to "0"

        tell application "Terminal"
            activate
            set numberOfWindows to (numberOfWindows + (count windows))
            if numberOfWindows is 0 then
                do script with command "cd " & quoted form of the_path
                activate
            else
                activate
                delay (0.3)
                tell application "System Events"
                    keystroke "t" using command down
                end tell
                do script with command "cd " & quoted form of the_path in window 0
            end if

        end tell
    end repeat
    return input
end run

Tout le mérite de ce code revient à Jeroen Leenarts . J'ai juste fait quelques petits ajustements.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X