BASH: chemins fichiers

Tout ce qui concerne la programmation.
Répondre
Avatar du membre
piratebab
Site Admin
Site Admin
Messages : 3748
Enregistré le : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors ligne

Bonjour,
je cale sur un truc probablement tout simple.
J'ai fait un script ecasond pour lancer l'écoute de plusieurs fichiers wav;

Code : Tout sélectionner

#!/bin/bash
ecasound \
     -a:1 -i bass.wav \
     -a:2 -i drums.wav \
     -a:3 -i other.wav -epp:100\
     -a:4 -i vocals.wav -epp:0\
     -a:all -o alsa
Si je le lance depuis le mê répertoite, tout va bien.
Si je le lance depuis un autre répertoire en utilisant un chemin absolu, il ne trouve pas les fichiers.wav.
Est ce qu'il faut que je mette le chemin absolu de chaque fichier .wav, ou bien il y a un façon d'indiquer qu'ils sont dans le même rep que dans le script?
Avatar du membre
vv222
Modérateur
Modérateur
Messages : 483
Enregistré le : 18 avr. 2016, 20:14
Localisation : Bretagne
Contact :
Status : Hors ligne

Il y a plusieurs options, comme souvent :icon_e_wink:

Se placer automatiquement dans le répertoire du script :

Code : Tout sélectionner

#!/bin/bash

# Récupération du chemin du répertoire contenant le script
SCRIPT_DIR=$(dirname "$0")

# Positionnement du répertoire de travail dans celui contenant le script
cd "$SCRIPT_DIR"

ecasound \
     -a:1 -i bass.wav \
     -a:2 -i drums.wav \
     -a:3 -i other.wav -epp:100\
     -a:4 -i vocals.wav -epp:0\
     -a:all -o alsa
Donner le chemin complet des fichiers :

Code : Tout sélectionner

#!/bin/bash

# Récupération du chemin du répertoire contenant le script
SCRIPT_DIR=$(dirname "$0")

ecasound \
     -a:1 -i "${SCRIPT_DIR}/bass.wav" \
     -a:2 -i "${SCRIPT_DIR}/drums.wav" \
     -a:3 -i "${SCRIPT_DIR}/other.wav" -epp:100\
     -a:4 -i "${SCRIPT_DIR}/vocals.wav" -epp:0\
     -a:all -o alsa
Avatar du membre
piratebab
Site Admin
Site Admin
Messages : 3748
Enregistré le : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors ligne

Merci, ça m'a permit d'apprendre un nouveau truc!
Avatar du membre
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Enregistré le : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors ligne

Je valide le propos de @lol, à un détail près :

SCRIPT_DIR="$(dirname "$(readlink -f -- "$0")")"
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar du membre
vv222
Modérateur
Modérateur
Messages : 483
Enregistré le : 18 avr. 2016, 20:14
Localisation : Bretagne
Contact :
Status : Hors ligne

Je m’appelle vv222, pas lol :003:

Pour info, la définition de variable de cette manière est une situation un peu spécifique.
Ces deux formes sont strictement équivalentes, y compris si commande retourne une valeur avec des espaces :

Code : Tout sélectionner

VARIABLE="$(commande)"
VARIABLE=$(commande)
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3474
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

vv222 a écrit : 02 avr. 2021, 17:07 Je m’appelle vv222, pas lol :003:

Menteur! :rofl:
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 1491
Enregistré le : 04 juin 2016, 14:50
Status : Hors ligne

Bonjour, :006:

— je déterre pour un complément —

Poursuivant mon apprentissage,
je commence à faire usage des commandes :
  • source
  • export
  • declare -x
afin d'écrire des scripts modulaires et ré-utilisables.

Comme dans le cas initial de piratebab,
une condition nécessaire pour la "portabilité" (usage indépendant des répertoires courant et d'installation du script)
est de récupérer dans une variable le chemin (absolu) du script principal pour qu'il puisse appeler les sous-scripts que je place (relativement) dans ./modules

Jusqu'à présent j'utilisais des chemins "directs" (sans liens) et

Code : Tout sélectionner

SCRIPT_DIR=$(realpath $(dirname "$0"))
#
# et pour le chemin vers les sous-scripts
MOD_DIR=${SCRIPT_DIR}/modules
#
# que j'appelle avec
source ${MOD_DIR}/sub.sh
... fonctionnait très bien.


Sauf que si j'utilise un lien pour lancer le script principal,

je récupère maintenant le chemin du répertoire contenant le lien. :012:


J'ai testé en remplaçant realpath par realpath -P ou readlink
mais ça ne fonctionne pas mieux,
alors que si je passe ces commandes directement dans le terminal j'obtiens bien le vrai chemin.

Même :

Code : Tout sélectionner

$ realpath /home/data/docs/tests/bash/test/main_script.sh
/home/data/docs/tests/bash/main_script.sh
renvoie la bonne réponse.

--------------------------------------------------------

Du coup, j'ai testé la solution de PengouinPdt avec :

SCRIPT_DIR=$(realpath $(dirname $(readlink -f -- "$0")))

ça fonctionne ! :003:

mais j'ai comme l'impression que ça pourrait être simplifié ???


Question annexe

À quoi sert -- dans readlink -f -- "$0"

car ça fonctionne aussi sans... :017:


Merci pour vos lumières :banana_parachute:
Debian stable - XFCE
Avatar du membre
vv222
Modérateur
Modérateur
Messages : 483
Enregistré le : 18 avr. 2016, 20:14
Localisation : Bretagne
Contact :
Status : Hors ligne

M’est avis que cette déclaration :

Code : Tout sélectionner

SCRIPT_DIR=$(realpath $(dirname $(readlink -f -- "$0")))
serait avantageusement remplacée par cette version plus simple :

Code : Tout sélectionner

SCRIPT_DIR=$(dirname "$(realpath "$0")")
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 1491
Enregistré le : 04 juin 2016, 14:50
Status : Hors ligne

vv222 a écrit : 02 juil. 2021, 22:06 avantageusement remplacée par cette version plus simple :

Code : Tout sélectionner

SCRIPT_DIR=$(dirname "$(realpath "$0")")

Merci :good:
Debian stable - XFCE
Répondre