IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

bash : définir le chemin d'un fichier à ecrire indépendamment de l'arboresence et d'où on se trouve


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    physicien
    Inscrit en
    mai 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : physicien

    Informations forums :
    Inscription : mai 2022
    Messages : 32
    Points : 20
    Points
    20
    Par défaut bash : définir le chemin d'un fichier à ecrire indépendamment de l'arboresence et d'où on se trouve
    bonjour
    j'ai un petit script om je souhaite ecrire dans un fichier, tres simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "francais" >> ./fichier.txt
    echo "english" >> ~/prog/perso/ecriture/file.txt
    ce script est dans un fichier write.sh
    ce fichier se trouve dans l'arboresence suivante:
    /home/user1/prog/perso/ecriture
    mon but est de créer ces fichiers dans le dossier dans lequel se trouve le script, sans devoir ecrire tout le chemin d'accès, donc j'aimerai que la 1ere ligne de commande fonctionne à tous les coups

    En effet, j'ai d'autres sous-dossiers avec d'autres scripts comme dans les arborescences suivantes
    /home/user1/prog/perso/calculer
    j'ai aussi d'autres scripts qui sont dans divers sous dossier dans cette arboresence:
    /home/user1/prog/pro
    quand je veux lancer le script write.sh, je me place donc dans le dossier qui contient le script en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd /home/user1/prog/perso/ecriture
    puis je fais .
    le code s'execute et j'ai 2 fichiers sui sont créés dans le dossier ecriture, où se trouve mon script.

    si je me place ailleurs, par exemple en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd /home/user1/prog/perso
    puis si je fais .
    le code s'execute mais j'ai un fichier qui est créé dans le dossier perso, qui est le dossier dans lequel je me suis placé pour écrire lancer le script.
    c'est le fichier qui est créé selon la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "francais" >> ./fichier.txt
    or j'aimerai qu'il se crée dans le dossier dans le quel se trouve le script, sans ecrire tout le chemin complet.

    est-ce que la seule solution est de se placer dans le dossier dans lequel se trouve le script avant de le lancer?
    où y'a un autre moyen de définit le chemin d'accès du fichier mais sans avoir à définir tout les chemin d'accès? et je peux ainsi lancer le script sans me soucier de savoir où je suis dans mon arboresence.


    je demande ca j'ai j'aimerai donner ce script à des collègues, et il n'auront pas la meme arboresence que moi, c'est pourquoi je voulais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "francais" >> ./fichier.txt
    pour ne pas indiquer le chemin d 'accès complet du fichier pour qu'on ne soit pas obligé de créer les memes sous dossier que moi.
    merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 4 160
    Points : 12 348
    Points
    12 348
    Par défaut
    A executer dans un script (pour avoir le $0 comme nom de commande)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FOOBAR=$(dirname $(readlink -f "$0"))
    echo "$FOOBAR"
    Cordialement.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    7 261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 7 261
    Points : 18 710
    Points
    18 710
    Par défaut
    Citation Envoyé par man readlink
    Note realpath(1) is the preferred command to use for canonicalization functionality.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 5 073
    Points : 12 833
    Points
    12 833
    Par défaut
    Bonjour

    Aucune de vos deux propositions ne marchent hors d'un script.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [15:15:57 ~]$ cd un/dossier
    [15:15:59 ~/un/dossier]$ realpath $0
    realpath*: option invalide -- 'b'
    Saisissez «*realpath --help*» pour plus d'informations.
    [15:16:04 ~/un/dossier]$ realpath -- $0
    /home/flodelarab/un/dossier/-bash
    [15:16:14 ~/un/dossier]$ man realpath
    [15:20:40 ~/un/dossier]$ dirname $(readlink -f "$0")
    readlink*: option invalide -- 'b'
    Saisissez «*readlink --help*» pour plus d'informations.
    dirname: opérande manquant
    Saisissez «*dirname --help*» pour plus d'informations.
    [15:20:55 ~/un/dossier]$ dirname $(readlink -f -- "$0")
    /home/flodelarab/un/dossier
    [15:21:11 ~/un/dossier]$
    bash ne se trouve évidemment pas dans le dossier courant.

    @marietar : Tous tes chemins sont absolus. Le plus simple est de faire des chemins relatifs et demander aux utilisateurs d'être dans le dossier du script, lors de l'exécution.
    De plus, tu utilises les noms écrits en dur. On peut suggérer d'utiliser des variables. Et un fichier de configuration.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    7 261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 7 261
    Points : 18 710
    Points
    18 710
    Par défaut
    Aucune de vos deux propositions ne marchent hors d'un script.
    la demande de marietar s'inscrit expressément dans le cadre d'un script; je ne vois pas l'intérêt de faire cette manipulation en dehors.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre à l'essai
    Homme Profil pro
    physicien
    Inscrit en
    mai 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : physicien

    Informations forums :
    Inscription : mai 2022
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    merci, je vais tester vos solutions.
    que voulez vous dire par marcher hors d'un script ou marcher dans un script???

  7. #7
    Expert confirmé
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    1 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 1 362
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Dans un script Bash, pour récupérer l'adresse du dossier qui contient ce script, on peut faire :

    Code Bash : Sélectionner tout - Visualiser dans une fenêtre à part
    SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    dirname "${BASH_SOURCE[0]}" est plus fiable que dirname "$0".

    C'est la solution conseillée par l'article The Right Way to Get the Directory of a bash Script.

    Mais, comme le prévient l'article, cette solution n'est pas suffisante si on invoque ce script depuis un lien symbolique. L'article présente alors aussi une solution avec une boucle qui appelle readlink.

    N_BaH a mentionné realpath mais, sur StackOverflow, un certain knocte avait dit ne pas avoir cette commande sur macOS (realpath: command not found), donc il semble que ce ne soit pas portable.

    À part ça, personnellement, c'est le genre de cas où je me dis que le langage Bash est trop prise de tête et qu'il est plus sage de basculer sur Python :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from pathlib import Path
    script_dir = Path(__file__).resolve().parent

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    avril 2008
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : avril 2008
    Messages : 2 048
    Points : 5 686
    Points
    5 686
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    N_BaH a mentionné realpath mais, sur StackOverflow, un certain knocte avait dit ne pas avoir cette commande sur macOS (realpath: command not found), donc il semble que ce ne soit pas portable.
    Effectivement, realpath est une commande faisant partie de la formule brew "coreutils" (comme indiqué par dragon788 dans le 3ème commentaire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    % realpath --help
    Usage: realpath [OPTION]... FILE...
    Print the resolved absolute file name;
    all but the last component must exist
     
      -e, --canonicalize-existing  all components of the path must exist
      -m, --canonicalize-missing   no path components need exist or be a directory
      -L, --logical                resolve '..' components before symlinks
      -P, --physical               resolve symlinks as encountered (default)
      -q, --quiet                  suppress most error messages
          --relative-to=DIR        print the resolved path relative to DIR
          --relative-base=DIR      print absolute paths unless paths below DIR
      -s, --strip, --no-symlinks   don't expand symlinks
      -z, --zero                   end each output line with NUL, not newline
          --help        display this help and exit
          --version     output version information and exit
     
    GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
    Report any translation bugs to <https://translationproject.org/team/>
    Full documentation <https://www.gnu.org/software/coreutils/realpath>
    or available locally via: info '(coreutils) realpath invocation'
     
    % ls -l /usr/local/bin/realpath
    lrwxrwxr-x  1 jack  admin  36 20 mai  2022 /usr/local/bin/realpath@ -> ../Cellar/coreutils/9.1/bin/realpath

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    7 261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 7 261
    Points : 18 710
    Points
    18 710
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    N_BaH a mentionné realpath mais, sur StackOverflow, un certain knocte avait dit ne pas avoir cette commande sur macOS (realpath: command not found), donc il semble que ce ne soit pas portable.
    il y a un sous-forum relatif aux commandes POSIX (portables), mais ce n'est pas ici.
    ici, c'est GNU, et dans GNU coreutils, il y a realpath.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre à l'essai
    Homme Profil pro
    physicien
    Inscrit en
    mai 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : physicien

    Informations forums :
    Inscription : mai 2022
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    il y a un sous-forum relatif aux commandes POSIX (portables), mais ce n'est pas ici.
    ici, c'est GNU, et dans GNU coreutils, il y a realpath.
    c'est quoi GNU svp?

  11. #11
    Membre à l'essai
    Homme Profil pro
    physicien
    Inscrit en
    mai 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : physicien

    Informations forums :
    Inscription : mai 2022
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    Bonjour,

    Dans un script Bash, pour récupérer l'adresse du dossier qui contient ce script, on peut faire :

    Code Bash : Sélectionner tout - Visualiser dans une fenêtre à part
    SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    dirname "${BASH_SOURCE[0]}" est plus fiable que dirname "$0".

    C'est la solution conseillée par l'article The Right Way to Get the Directory of a bash Script.

    Mais, comme le prévient l'article, cette solution n'est pas suffisante si on invoque ce script depuis un lien symbolique. L'article présente alors aussi une solution avec une boucle qui appelle readlink.

    N_BaH a mentionné realpath mais, sur StackOverflow, un certain knocte avait dit ne pas avoir cette commande sur macOS (realpath: command not found), donc il semble que ce ne soit pas portable.

    À part ça, personnellement, c'est le genre de cas où je me dis que le langage Bash est trop prise de tête et qu'il est plus sage de basculer sur Python :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from pathlib import Path
    script_dir = Path(__file__).resolve().parent
    interessant mais c'est quoi un lien symbolique?

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    7 261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 7 261
    Points : 18 710
    Points
    18 710
    Par défaut
    tu n'as pas internet ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Définir le chemin des fichiers ressource
    Par Claude_Azoulai dans le forum Visual Studio
    Réponses: 1
    Dernier message: 09/03/2011, 11h07
  2. Réponses: 3
    Dernier message: 02/08/2010, 18h36
  3. Définir un chemin URL d'un fichier du disque dur
    Par Claude_Azoulai dans le forum VB.NET
    Réponses: 2
    Dernier message: 22/03/2010, 16h51
  4. Réponses: 2
    Dernier message: 01/12/2009, 15h35
  5. Fonction permettant d'afficher le chemin d'un fichier
    Par kilinette dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2004, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo