3 votes

Ouvrez un terminal avec plusieurs onglets et exécutez l'application qui modifie de façon unique la variable PS1 pour chaque onglet

Ce que j'essaie de faire :

  1. Ecrivez un script pour ouvrir 3 onglets.
  2. cd dans un dossier différent dans chaque onglet (c'est-à-dire : exécuter une commande unique).
  3. faire en sorte que chaque onglet ait un titre unique en modifiant son titre local PS1 variable
  4. S'assurer que chaque onglet reste ouvert après l'exécution du script.

Je veux que ce script soit programmé pour que je puisse cliquer sur le script sur mon bureau et qu'il ouvre les terminaux comme je le voudrais pour mon environnement de développement quotidien.

Description :

J'ai ce script pour essayer d'ouvrir 3 onglets de terminal avec des commandes uniques à exécuter dans les onglets :

open_tabs.sh

#!/bin/bash

gnome-terminal --tab -- bash -ic "set-title title 1; exec bash"
gnome-terminal --tab -- bash -ic "cd ~; set-title title 2; exec bash"
gnome-terminal --tab

Lorsque je l'exécute avec ./open_tabs.sh il ouvre 3 nouveaux onglets, mais malheureusement set-title ne fonctionne pas pour définir le titre de l'onglet ! Il apparaît que le PS1 ne reste pas en place avec mon set-title appel. Le site exec bash est là pour garder l'onglet ouvert, par cette réponse et les commentaires en dessous .

J'ai set-title définie comme une fonction dans ~/.bashrc comme ça. Son but est de définir la chaîne de titre en haut de toute fenêtre de terminal. Il fonctionne parfaitement lorsque je l'utilise manuellement. Ex : set-title hey how are you? mettra "hey how are you ?" en haut de ma fenêtre de terminal.

# From: https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
set-title() {
    # If the length of string stored in variable `PS1_BAK` is zero...
    # - See `man test` to know that `-z` means "the length of STRING is zero"
    if [[ -z "$PS1_BAK" ]]; then
        # Back up your current Bash Prompt String 1 (`PS1`) into a global backup variable `PS1_BAK`
        PS1_BAK=$PS1 
    fi

    # Set the title escape sequence string with this format: `\[\e]2;new title\a\]`
    # - See: https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
    TITLE="\[\e]2;$@\a\]"
    # Now append the escaped title string to the end of your original `PS1` string (`PS1_BAK`), and set your
    # new `PS1` string to this new value
    PS1=${PS1_BAK}${TITLE}
}

Comment puis-je résoudre ce problème pour que chaque onglet exécute une commande, définisse son titre en modifiant sa section PS1 variable, et reste ouvert ?

Notez que gnome-terminal a rendu obsolète son --title y --command d'où ces solutions de contournement.

En rapport :

  1. bash : "command not found" lors de l'appel d'une fonction définie dans le fichier ~/.bashrc dans la commande `bash -c` en ouvrant l'onglet gnome-terminal

  2. https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383

  3. Ouvrir le terminal avec plusieurs onglets et exécuter l'application <== c'est ce que j'essaie vraiment de résoudre, mais gnome-terminal 's --command ( -e ) est désormais obsolète !

    # Option “--command” is deprecated and might be removed in a later version of gnome-terminal.
    # Use “-- ” to terminate the options and put the command line to execute after it.
  4. Comment exécuter un script sans fermer le terminal ?

1voto

Gabriel Staples Points 5149

Comme c'est le cas pour la plupart des programmes, la résolution du problème a été extrêmement difficile. J'ai dû étudier un tas de choses sur les variables Bash, et comment utiliser export y source (ou l'opérateur point POSIX, . ), et comment bash se charge, et ce que les interactifs -i le mode bash était, etc etc.

J'ai trouvé man bash y man test pour être également utile. Voici comment faire ce que je veux faire, c'est-à-dire :

  1. Ecrivez un script pour ouvrir 3 onglets.
  2. cd dans un dossier différent dans chaque onglet (c'est-à-dire : lancez une commande unique).
  3. faire en sorte que chaque onglet ait un titre unique en modifiant sa variable locale PS1
  4. S'assurer que chaque onglet reste ouvert après l'exécution du script.

1er, ajoutez ceci au bas de votre ~/.bashrc fichier :

# Function to allow a user to arbitrarily set the terminal title to anything
# Example: `set-title this is title 1`
set-title() {
    # Set the PS1 title escape sequence; see "Customizing the terminal window title" here: 
    # https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
    TITLE="\[\e]2;$@\a\]" 
    PS1=${PS1_BAK}${TITLE}
}

# Back up original PS1 Prompt 1 string when ~/.bashrc is first sourced upon bash opening
if [[ -z "$PS1_BAK" ]]; then # If length of this str is zero (see `man test`)
    PS1_BAK=$PS1 
fi

# Set the title to a user-specified value if and only if TITLE_DEFAULT has been previously set and
# exported by the user. This can be accomplished as follows:
#   export TITLE_DEFAULT="my title"
#   . ~/.bashrc
# Note that sourcing the ~/.bashrc file is done automatically by bash each time you open a new bash 
# terminal, so long as it is an interactive (use `bash -i` if calling bash directly) type terminal
if [[ -n "$TITLE_DEFAULT" ]]; then # If length of this is NONzero (see `man test`)
    set-title "$TITLE_DEFAULT"
fi

2èmement, créez ce script pour ouvrir 3 onglets uniques avec 3 commandes cd uniques et 3 titres uniques :

open_tabs.sh :

gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 1'; cd ..; exec bash;"
gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 2'; cd ../..; exec bash;"
gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 3'; cd ../../..; exec bash;"

Maintenant, ouvrez un terminal et exécutez la commande open_tabs.sh script :

./open_tabs.sh

Voilà ! C'est magique ! Ces 3 nouveaux onglets sont maintenant affichés en haut de mon terminal, et chacun d'entre eux a fait la bonne chose suivante cd et chacun a le titre approprié que j'ai fixé !

enter image description here

Tout ceci sera placé dans mon projet dotfiles : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles .

Solution complète et définitive : voir ici : Ouvrir le terminal avec plusieurs onglets et exécuter l'application

-1voto

Gewure Points 363

Je pense que vous devriez utiliser & pour que vos processus s'exécutent en arrière-plan.

https://www.tecmint.com/run-linux-command-process-in-background-detach-process/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X