BASH: chemins fichiers

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 3928
Inscription : 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 de l’utilisateur
vv222
Modérateur
Modérateur
Messages : 580
Inscription : 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 de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 3928
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Merci, ça m'a permit d'apprendre un nouveau truc!
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 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 de l’utilisateur
vv222
Modérateur
Modérateur
Messages : 580
Inscription : 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 de l’utilisateur
lol
Site Admin
Site Admin
Messages : 3755
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

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

Menteur! :rofl:
Debian stable. XFCE.
Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 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 de l’utilisateur
vv222
Modérateur
Modérateur
Messages : 580
Inscription : 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 de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 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