Pages : 1
#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 )
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
Hors ligne
#10 Le 25/09/2007, à 13:05
- alexduf
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
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
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
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
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
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
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
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 !
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 , 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
Pages : 1