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/08/2007, à 00:36

alexduf

[BASH] Répertoire courant

Bonjour,

J'aimerais savoir si il est possible lors de l'exécution d'un script de savoir où celui-ci est placé?

du style il est dans le répertoire home de l'utilisateur, on le lance depuis / (grace au path), comment faire?
J'imagine qu'il doit y avoir une variable spéciale mais là je sèche un peu...

Merci !

Hors ligne

#2 Le 26/08/2007, à 01:19

best_friend_fr

Re : [BASH] Répertoire courant

pwd ?
la variable serait $PWD


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#3 Le 26/08/2007, à 01:32

HymnToLife

Re : [BASH] Répertoire courant

Non, $PWD contient le répertoire courant, qui n'est pas nécessairement celui où est placé le script. S'il est dans le $PATH, on peut avoit son chemin absolu avec which :

firas@Ana ~ $ which rm
/bin/rm

- Rodrigue, as-tu du cœur ?
- Non, mais j'ai du pique !

Hors ligne

#4 Le 26/08/2007, à 04:22

kaworu

Re : [BASH] Répertoire courant

salut !
which marche bien à condition que le script en question se trouve dans $PATH. Autrement la variable $0 contient le chemin complet du script. tu peux donc récupérer le chemin (relatif si tu l'as lancé avec ./monscript ou ../monscript par exemple) comme ça :

path=$(dirname $0)

ou encore (plus portable, car celui au dessus marche uniquement avec bash) :

path=`dirname $0`

"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#5 Le 26/08/2007, à 11:53

alexduf

Re : [BASH] Répertoire courant

merci!

ok donc je dois faire un test en plusieurs temps?
si which me ramène quelque chose, tant mieux, sinon j'utilise $0, si $0 contient un chemin relatif, je l'utilise par rapport à PWD....

C'est ca?

sinon kaworu oui j'utilise bien le BASH

Dernière modification par alexduf (Le 26/08/2007, à 12:01)

Hors ligne

#6 Le 26/08/2007, à 12:29

alexduf

Re : [BASH] Répertoire courant

(oh le double post roll)

NOM_SCRIPT=toto.sh

function whereami() {

	WHICH=$(which "$NOM_SCRIPT")
	CODE_RETOUR=$?

	if [ $CODE_RETOUR -eq 0 ]; then
	
		CHEMIN=$(dirname $WHICH)
	else

		CHEMIN=$(dirname $0)
		if [ "$CHEMIN" = "." ]; then
			CHEMIN=$(pwd)
		else 
			if [ "${CHEMIN:0:2}" = "./" ]; then
				CHEMIN="$(pwd)/${CHEMIN:2}"
			fi
		fi
		
	fi
	
	echo $CHEMIN

}


EMPLACEMENT=$(whereami)
echo $EMPLACEMENT

j'aimerais avoir votre avis,  savoir si il n'y a pas d'énormité qui vous saute aux yeux.
J'ai aussi encore un cas à gérer, il est possible que le script soit appelé par un lien symbolique depuis /usr/bin/ par exemple alors que le script se trouve dans le home.

Comment repère-t-on  un lien symbolique, et surtout comment le résout-on ?

Hors ligne

#7 Le 26/08/2007, à 17:14

abetsic

Re : [BASH] Répertoire courant

[ -l ton_fichier ] teste si "ton_fichier" est un lien symbolique (man test pour plus d'infos sur les tests)
Pour le résoudre tu peux essayer de faire un "ls -l ton_lien_symbolique" et parser la sortie.

Hors ligne

#8 Le 25/09/2007, à 09:42

alexduf

Re : [BASH] Répertoire courant

En fait il y a un truc qui me turlupine, c'est que c'est affreusement compliqué et incertain, pour quelque chose qui me parait pourtant simple.

l'interpréteur bash est bien obligé à un moment ou un autre de connaître cette information, ne peut-on pas la récupérer?

Hors ligne

#9 Le 25/09/2007, à 11:20

ianic

Re : [BASH] Répertoire courant

Pour les liens symboliques tu veux récupérer l'emplacement du lien ou du script de ton home ?
Essayes ça qui est une version plus simple de ton script (il est possible que j'oublie un cas limite, genre ton test ./ mais je ne sais pas quand tu peux avoir ça) :

dn=$(dirname $0)
[ $dn == "." ] && echo $PWD || echo $dn

Mais je me dis aussi qu'il doit bien exister un truc plus simple smile

Hors ligne

#10 Le 25/09/2007, à 13:05

alexduf

Re : [BASH] Répertoire courant

ianic a écrit :

Pour les liens symboliques tu veux récupérer l'emplacement du lien ou du script de ton home ?
Essayes ça qui est une version plus simple de ton script (il est possible que j'oublie un cas limite, genre ton test ./ mais je ne sais pas quand tu peux avoir ça) :

dn=$(dirname $0)
[ $dn == "." ] && echo $PWD || echo $dn

Mais je me dis aussi qu'il doit bien exister un truc plus simple smile

le problème c'est si on lance le script en faisant :

../../toto/script.sh

Je sais c'est un peu tordu mais c'est tout à fait possible. Sinon je vais finir par faire quelque chose en C. même si je ne sais pas si c'est possible.

Hors ligne

#11 Le 25/09/2007, à 13:51

ianic

Re : [BASH] Répertoire courant

Deuxième tentative :

dn=$(dirname $0)
echo $(cd $dn && pwd)

Hors ligne

#12 Le 25/09/2007, à 17:08

alexduf

Re : [BASH] Répertoire courant

ianic a écrit :

Pour les liens symboliques tu veux récupérer l'emplacement du lien ou du script de ton home ?

En fait je vais expliquer mon problème.
J'ai besoin de ce script pour construire le classpath d'une appli java. Cette appli peut-etre placée n'importe où...
Le script peut aussi bien être appelé par le PATH, que par un accès direct au script, ou par un lien symbolique, et, plus vicieux, un lien symbolique dans le path.


dn=$(dirname $0)
echo $(cd $dn && pwd)

Merci, je teste dès que je peux, il me restera a résoudre les liens symboliques.

Hors ligne

#13 Le 23/04/2008, à 14:52

tanchoux

Re : [BASH] Répertoire courant

Bonjour,

La solution précédente ne gère pas le classpath ni les liens symboliques il me semble.

Je viens de faire ce code en m'inspirant des posts précédents

function whereiam ()
{
	# Si existe, c'est le bon, sinon le shell est dans le path
	test -f $0 && cheminExe=$0 || cheminExe=`which $0`

	# Si la commande est un lien, on recupère le fichier pointé par ce lien
	test -L $cheminExe && cheminReel=`readlink -f $cheminExe` || cheminReel=$cheminExe

	repReel=`dirname $cheminReel`
	echo $(cd $repReel && pwd)
}

#14 Le 20/09/2011, à 17:22

BlueRabbit

Re : [BASH] Répertoire courant

salut ,

tester sa:


BASE="$(cd -P -- $(dirname -- "$0"); pwd -P)"
echo $BASE

ou

#!/bin/bash
echo "######### DONNE LE DOSSIER DU SCRIPT ##############"
BASE=$(
cmd=$0
case $0 in
    */*)
     ;;
    *)
     [ -e "$cmd" ] || cmd=$(command -v -- "$0") || exit
     ;;
esac
cd -P -- "$(dirname -- "$cmd")" &&
    pwd -P
)
echo $BASE

Dernière modification par BlueRabbit (Le 21/09/2011, à 09:59)


archlinux 64 Bits
Portable ASUS i5

Hors ligne

#15 Le 23/09/2011, à 22:21

pingouinux

Re : [BASH] Répertoire courant

Bonsoir,

Voici une fonction qui retourne le chemin complet d'un fichier

chemin() { [ "`echo $1 | cut -c1`" = "/" ] && echo $1 || echo `pwd`/$1; }

Si le premier caractère du nom du fichier est un /, on a un chemin absolu, et on ne fait rien
Sinon, on ajoute `pwd`/ devant le nom

Usage :

chemin_du_fichier=`chemin fichier`

Cordialement

Hors ligne

#16 Le 25/09/2011, à 18:11

BlueRabbit

Re : [BASH] Répertoire courant

donne un résulta même si le fichier n'existe  pas ???


archlinux 64 Bits
Portable ASUS i5

Hors ligne

#17 Le 25/09/2011, à 18:52

pingouinux

Re : [BASH] Répertoire courant

@ BlueRabbit #16     Réf: Pingouinux #15

chemin() { [ "`echo $1 | cut -c1`" = "/" ] && echo $1 || echo `pwd`/$1; }
chemin_du_fichier=`chemin fichier`

C'est la chaîne de caractères fichier qui est traitée, mais cette commande se fiche royalement que fichier en soit un ou pas

Hors ligne

#18 Le 26/09/2011, à 13:50

HP

Re : [BASH] Répertoire courant

kaworu a écrit :
path=$(dirname $0)

ou encore (plus portable, car celui au dessus marche uniquement avec bash)

C'est absolument faux…

# dash -c 'echo $(ls)'
# sh -c 'echo $(ls)'
# ash -c 'echo $(ls)'

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#19 Le 26/09/2011, à 16:01

ehmicky

Re : [BASH] Répertoire courant

HP a écrit :
kaworu a écrit :
path=$(dirname $0)

ou encore (plus portable, car celui au dessus marche uniquement avec bash)

C'est absolument faux…

# dash -c 'echo $(ls)'
# sh -c 'echo $(ls)'
# ash -c 'echo $(ls)'

Je dis peut-être une bêtise, mais je crois que $( ) n'est pas dispo dans le sh POSIX (mais dispo sous dash) ; or /bin/sh sous Ubuntu n'est pas le sh POSIX mais un lien vers /bin/dash.


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#20 Le 26/09/2011, à 16:29

HP

Re : [BASH] Répertoire courant

ehmicky a écrit :

or /bin/sh sous Ubuntu n'est pas le sh POSIX mais un lien vers /bin/dash.

çà c'est exact :

ls -l $(which sh)
lrwxrwxrwx 1 root root 4 2011-06-08 11:16 /bin/sh -> dash

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#21 Le 26/09/2011, à 17:30

HP

Re : [BASH] Répertoire courant

ehmicky a écrit :

Je dis peut-être une bêtise, mais je crois que $( ) n'est pas dispo dans le sh POSIX […]

Et ça semble bien être une bêtise : Insufficiently known POSIX shell features :

Update 2011/02/28: Note that the above $() syntax, as an alternative to nesting, is also valid POSIX and works in every halfway modern shell. I use it all the time. Backquotes get really ugly as soon as you need to nest them.

ici aussi :

je l'ai vu aussi autre part, dans des docs plus « officielles », mais je ne me souviens plus où… parce que perso, j'évite autant que faire se peut les bashismes.

Dernière modification par HP (Le 26/09/2011, à 17:48)


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#22 Le 26/09/2011, à 18:07

alej

Re : [BASH] Répertoire courant

Et ça...

#!/bin/bash
ABS_PATH=$(readlink -e $0)
echo $ABS_PATH

?

Hors ligne

#23 Le 27/09/2011, à 16:17

ehmicky

Re : [BASH] Répertoire courant

HP a écrit :
ehmicky a écrit :

Je dis peut-être une bêtise, mais je crois que $( ) n'est pas dispo dans le sh POSIX […]

Et ça semble bien être une bêtise : Insufficiently known POSIX shell features :

Update 2011/02/28: Note that the above $() syntax, as an alternative to nesting, is also valid POSIX and works in every halfway modern shell. I use it all the time. Backquotes get really ugly as soon as you need to nest them.

ici aussi :

je l'ai vu aussi autre part, dans des docs plus « officielles », mais je ne me souviens plus où… parce que perso, j'évite autant que faire se peut les bashismes.

Autant pour moi, merci pour la correction !
Je remarque au passage que beaucoup de choses que je pensais des bashismes font partie de POSIX, va falloir me mettre à jour sur le sujet ! wink


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#24 Le 01/08/2012, à 22:50

cpt_aimless

Re : [BASH] Répertoire courant

Bonsoir,

Ayant juste lu la question et pas pour relancer le débat tongue, est-ce que ce n'est pas cette ligne de commande que tu recherches ? (à placer en début de script)

workFolder=$(readlink -f $(dirname $0))

Bonne nuit

Hors ligne