Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/05/2008, à 08:49

Gibou

[Résolu] script shell exécuté à chaque commande

Bonjour,

Je voudrais savoir où placer un script shell qui se lancerait à chaque commande lancée dans le terminal.
Pas à chaque lancement du terminal hein, donc pas dans le bashrc/zshrc/etc...

Pour que ce soit plus clair, le but du jeu est d'avoir un affichage comme ceci:

-------------------------------------{répertoire courant}--
nico@gaston$

et ce, dans le but d'économiser de la place horizontalement puisque j'utilise un yakuake splité verticalement donc l'espace horizontal est cher ^^

Alors placer la variable contenant le répertoire courant (\W) entre crochet, c'est pas un souci.
Mais la taille du répertoire change et donc le nombre de tirets à placer à gauche du premier crochet change. Le but est d'avoir toujours "{répertoire courant}--" à la fin

Si je place ça dans le bashrc, le répertoire change bien mais pas le nombre de tirets avant.

Quelqu'un a-t-il une idée ?

Merci :-)

Dernière modification par Gibou (Le 27/05/2008, à 09:05)

Hors ligne

#2 Le 26/05/2008, à 10:45

Totor

Re : [Résolu] script shell exécuté à chaque commande

je suis pas certain d'avoir tout compris mais as-tu essayé d'inserer des batchs dans ta variable PS1 ?
style : PS1="`monBatch`"

Dernière modification par Totor (Le 26/05/2008, à 10:50)


-- Lucid Lynx --

Hors ligne

#3 Le 26/05/2008, à 11:04

Gibou

Re : [Résolu] script shell exécuté à chaque commande

alors, pour répondre à la première version de ton post, oui, des fonctions, j'ai essayé mais ça ne règle rien.

Pour les batchs, je ne connais pas sous linux. Je vais voir si je trouve un tuto bien foutu mais si tu as quelque chose à me proposer/conseiller, je suis tout ouïe :-)

Hors ligne

#4 Le 26/05/2008, à 11:09

bwana147

Re : [Résolu] script shell exécuté à chaque commande

Totor a écrit :

je suis pas certain d'avoir tout compris mais as-tu essayé d'inserer des batchs dans ta variable PS1 ?
style : PS1="`monBatch`"

Presque... Il faut des guillemets simples, sinon ton script est exécuté au moment où tu renseignes la variable PS1, et plus au moment où le shell affiche le prompt:

PS1='`monBatch`'

Dernière modification par bwana147 (Le 26/05/2008, à 11:10)

Hors ligne

#5 Le 26/05/2008, à 11:37

Gibou

Re : [Résolu] script shell exécuté à chaque commande

Donc, en gros, dans mon .bashrc, j'ai juste

PS1='`./.reloadps1.sh`'

et dans mon fichier .reloadps1.sh, je mets mon script ?

Si c'est ça, il me met "permission denied" alors que les deux fichiers ont les mêmes permissions (les miennes) et m'appartiennent. Par défaut, une application est lancée avec les droits de l'utilisateur donc.. je ne vois pas.

Dernière modification par Gibou (Le 26/05/2008, à 11:37)

Hors ligne

#6 Le 26/05/2008, à 11:46

Totor

Re : [Résolu] script shell exécuté à chaque commande

et bien sur nos serveurs, nous avons dans notre .profile ceci :

export PS1="`hostname`:\$PWD> "

à chaque commande shell, l'invite de la ligne de commande est donc ré-évaluée (variable PS1) après exécution de chaque commande, pour contenir le nom de la machine (appelle à l'instruction hostname) que l'on concatène au répertoire courant (variable $PWD). Les 2 valeurs étant séparés par  :.

Dans le même principe, tu peux donc te créer un petit script shell qui, en fonction du nombre de colonnes de ton term, te créer ton invite

ça peut donner un truc du genre :
script de détermination de ton invite :

#!/bin/bash

setSizeOfString()
{
        if [ $# -eq 2 ]; then
        maChaine=$1
        lgMax=$2
        else
                if [ $# -eq 1 ]; then
                        maChaine=""
                        lgMax=$1
                else
                        echo ""
                        exit
                fi
        fi

        maChaine=$maChaine"--"

        # on tronque la chaine
        maChaine=`echo ${maChaine}|cut -b -${lgMax}`

        # longueur de la chaine actuelle
        lgChaine=${#maChaine}

        while [ ${lgChaine} -lt ${lgMax} ]; do
                maChaine="-${maChaine}"
                lgChaine=$((${lgChaine}+1))
        done
        echo "${maChaine}"
}


# nombre de colonne du terminal
nbColTerm=`stty -a|grep columns|sed "s/^.*columns[ =]*\([0-9]*[^;]\).*/\1/"`

monInvite="`setSizeOfString ${PWD} ${nbColTerm}`"

echo ${monInvite}

tu enregistres ce fichier dans ton home et tu lui positionnes les droits d'exécution.

dans ton fichier .profile (ou tout ce que tu veux)

export PS1="`~/nomScriptCiDessus`"

Ne pas oublier de sourcer ton fichier .profile (ou de te reloguer)
voilà...

Dernière modification par Totor (Le 26/05/2008, à 11:49)


-- Lucid Lynx --

Hors ligne

#7 Le 26/05/2008, à 12:01

Totor

Re : [Résolu] script shell exécuté à chaque commande

bon, à priori, ça ne fonctionne que la 1ere fois où l'invite est affichée...
si tu change de dossier ou de la dimension du term, la fonction n'est plus appelée sad
je vais creuser...


-- Lucid Lynx --

Hors ligne

#8 Le 26/05/2008, à 12:19

Totor

Re : [Résolu] script shell exécuté à chaque commande

bwana147 : je n'avais pas vu ton post !
effectivement, avec les apostrophes, ça marche wink)

si ce n'est qu'il faut appuyer sur [ENTER] lorsque le term est redimensionné hmm

Dernière modification par Totor (Le 26/05/2008, à 12:20)


-- Lucid Lynx --

Hors ligne

#9 Le 26/05/2008, à 12:27

bwana147

Re : [Résolu] script shell exécuté à chaque commande

Gibou a écrit :

Donc, en gros, dans mon .bashrc, j'ai juste

PS1='`./.reloadps1.sh`'

"./.reloadps1.sh", le point signifie "dans le répertoire courant"... Dès que tu feras un "cd", ce sera cuit. Utilise plutôt un chemin absolu.

Hors ligne

#10 Le 26/05/2008, à 12:29

bwana147

Re : [Résolu] script shell exécuté à chaque commande

Totor a écrit :

si ce n'est qu'il faut appuyer sur [ENTER] lorsque le term est redimensionné hmm

Évidemment. Le prompt, c'est juste une chaîne affichée sur le terminal. Si on redimensionne le terminal, le shell ne va pas s'amuser à rafraîchir l'écran. C'est le prompt suivant qui prendra les modifications en compte.

Hors ligne

#11 Le 26/05/2008, à 13:11

Gibou

Re : [Résolu] script shell exécuté à chaque commande

Totor> Oui, de retour du repas de midi, j'ai effectué les modifs que tu proposes et en effet, ça ne marche plus dès qu'on change de répertoire :-/

Je continue de chercher, merci de me dire si vous avez trouvé une solution :-)

Hors ligne

#12 Le 26/05/2008, à 13:14

bwana147

Re : [Résolu] script shell exécuté à chaque commande

Gibou a écrit :

Totor> Oui, de retour du repas de midi, j'ai effectué les modifs que tu proposes et en effet, ça ne marche plus dès qu'on change de répertoire :-/

Je continue de chercher, merci de me dire si vous avez trouvé une solution :-)

Commence par relire le thread... Et change tes guillemets doubles (") en simples (')

Hors ligne

#13 Le 26/05/2008, à 13:32

Gibou

Re : [Résolu] script shell exécuté à chaque commande

Ben alors, les guillemets simples j'avais essayé mais ça ne marche pas. En fait, ça n'interpréte pas les codes couleurs et les \W

En fait, voilà le prompt que ça m'affiche:

\033[37m\]-----------------------------------------------------------------------------------------\033[0m\]{\033[36m\]\W\033[0m\]}\033[37m\]--\033[0m\]\n${debian_chroot:+($debian_chroot)}\u\033[36m\]@\033[0m\]\h\033[36m\]\$ \033[0m\]

Hors ligne

#14 Le 26/05/2008, à 22:29

bwana147

Re : [Résolu] script shell exécuté à chaque commande

C'est sûr que si tu inclus des \033 dans des guillemets simples, ça marchera beaucoup moins bien. \033 est une séquence qui doit être interpolée (dans des guillemets doubles) pour faire un caractère d'échappement (ASCII 27, soit 033 en octal). Or, dans des guillemets simples, rien n'est interpolé, même pas le backslash.

Si je comprends bien, c'est la série de tirets qui est la sortie de ton script. Il faut alors combiner les deux types de guillemets:

PS1="\033[37m\]"'`~/bin/ton_script`'"\033[0m..."

La partie à droite du signe égal sera en partie interpolée, ce qui aura pour résultat d'avoir PS1 qui contiendra des séquences d'échappement et une chaîne entre backtick. Quand PS1 sera à son tour interpolée, on aura le résultat escompté.

Une autre manière est d'insérer des caractères d'échappement littéralement dans le script qui renseigne PS1, et alors on peut les mettre dans les guillemets simples: il n'auront pas besoin d'être interpolés puisque ce sont des caractères bruts. Sous vi, on peut taper un caractère d'échappement avec la séquence de touches Ctrl-V, ESC (Ctrl-V est le préfixe qui permet d'insérer le code suivant littéralement dans le fichier). Visuellement, sous vi, tu verras des ^[ mais il s'agira en fait de caractères d'échappement.

Une troisième manière de faire et d'utiliser des guillemets doubles pour que les \033 soient interpolés, mais alors il faut mettre un backslash devant les backticks pour que ceux-ci ne soit pas interpolés trop tôt:

PS1="\033[37m\]\`~/bin/ton_script\`\033[0m....'

Le tout, c'est de bien comprendre comment le shell interpole quoi et dans quel ordre.

Dernière modification par bwana147 (Le 26/05/2008, à 22:39)

Hors ligne

#15 Le 27/05/2008, à 09:01

Gibou

Re : [Résolu] script shell exécuté à chaque commande

Merci beaucoup pour ta patience smile

Bonne journée

Hors ligne