Commande echo et options -e et -E

bonjour ,
ayant eu affaire à cette commande ( pour lister des fichiers ) j’ai voulu en savoir un peu plus et j’ai testé 2 options en particulier :

-e     Interpréter les échappements par contre-oblique
 -E    Ne pas interpréter les échappements par contre-oblique. C'est le
              comportement par défaut.

j’ai testé avec ou sans options :

mm@Xfce:~$ echo -E j\'aime
j'aime
mm@Xfce:~$ echo -e j\'aime
j'aime
mm@Xfce:~$ echo j\'aime
j'aime

ça me paraît en contradiction avec ce que j’ai lu , donc j’ai dû mal interpréter le manuel qui me paraissait pourtant clair . Où est mon erreur ?

note : je m’attendais à avoir des résultats différents selon l’option retenue ou l’absence d’option

Sans échappement par \ ou guillemets, c’est le shell qui interprète le \, pas echo.

D’autre part les séquences d’échappement prises en compte par echo sont spécifiques (voire page de manuel) alors que dans le shell le \ sert à traiter un caractère spécial comme un caractère normal.

J’en profite pour prévenir que le comportement de la commande echo n’est pas stable et varie selon les implémentations. Notamment la commande echo intégrée au shell dash (qui est l’interpréteur /bin/sh de Debian par défaut pour l’exécution non interactive des scripts) ne reconnaît ni -e ni -E comme des options et se comporte comme -e (interprète les séquences \*), contrairement aux implémentations de bash, ash/busybox ou coreutils. Pour avoir un comportement stable, il est recommandé d’utiliser plutôt la commande printf (qui n’est pas un remplacement direct, lire la page de manuel).

Note : echo et printf existent en tant que programmes indépendants mais aussi en tant que commandes intégrées (builtins) dans divers shells comme bash, dash, le shell ash inclus dans busybox (utilisé par l’installateur Debian et l’initramfs par défaut généré par initramfs-tools).

type echo
type printf
which echo
which printf

ouh la ouh la ! moi qui pensais que c’était simple …
en tout cas j’ai réussi à créer ma liste et à la faire enregistrer dans un fichier *txt comme je le souhaitais sauf qu’il me faut la mettre en colonnes et non en lignes qui sont quasi illisibles . Je peux le faire avec la commande ls puis faire un C/C dans un fichier créé pour l’occasion mais j’aurais préféré faire ça avec une seule commande de type :
echo liste des fichiers .pdf : $(ls) *.pdf > nom_du_fichier.txt

merci pour ces détails dans lesquels je me plongerai plus tard , si j’arrive à comprendre .

printf '%s\n' 'liste des fichiers .pdf :' *.pdf

?

très bien mais alors pourquoi les faire figurer dans man echo sans donner de précision ? Peut-être que l’auteur suppose qu’il a affaire uniquement à des professionnels ?

liste d’un ensemble de documents dans laquelle choisir , avant envoi éventuel , les sujets d’intérêt

fonctionne très bien mais pourquoi ma commande (ci-dessous) ne fonctionne pas alors que j’ai ajouté l’option -C pour la mise en colonne ?

echo liste des fichiers .pdf $(ls -C) *.pdf > file.txt

l’option -C est ignorée . Si j’utilise des guillemets " " l’option -C est bien prise en compte mais alors c’est *.pdf qui ne l’est pas et j’ai une colonne avec tous les éléments qui sont dans le répertoire sélectionné ( soit Documents )

echo « liste $(ls -C) *.pdf > file.txt »

note : bizarre les guillemets " " se transforment lorsque je valide « save edit »

J’ai découvert l’option « -e » dans un script, sans creuser pour autant, mais voilà un exemple d’utilisation :
Capture d’écran de 2022-03-06 17-57-39

Sinon, la commande echo ne me paraît pas adaptée à ce que tu veux faire. À chaque commande son rôle :
echo "Liste fichiers .pdf" > file.txt ; ls -C *.pdf >> file.txt

effectivement cette commande fonctionne mais :

  1. je ne savais pas qu’on pouvait sortir de ls dans un fichier-texte et je suppose donc que ce type de sortie doit être assez général ( je testerai )
  2. la commande echo me permettait de mettre un titre , un descriptif ou un commentaire en en-tête du fichier cible .

La page de manuel d’echo ne concerne que la commande echo du paquet coreutils, c’est explicitement mentionné dans celle-ci. Pour la commande echo intégrée aux divers interpréteurs de commandes, il faut consulter la page de manuel du shell correspondant (ou de bash-builtins pour bash).

Parce que c’est le shell qui sépare les arguments et echo prend les arguments un par un et les affiche en les séparant par un espace.

Utilisons les ressources du shell pour supprimer les redondances :

{ echo "Liste fichiers .pdf" ; ls -C *.pdf ; } > file.txt

ou

( echo "Liste fichiers .pdf" ; ls -C *.pdf ) > file.txt
2 J'aime

en relisant je m’aperçois que je n’avais pas compris la double-commande proposée par pled et je n’en avais retenu que la 2ème partie qui sort bien la liste voulue mais sans les commentaires éventuels , alors que l’ensemble réalise la fonction que je cherchais à créer .
Voilà qui est plus simple à comprendre que la commande printf que je vais laisser pour une étape ultérieure . Éventuellement .

après avoir trouvé la syntaxe propre au shell bash j’ai fini par comprendre cette ligne de commande ainsi que l’utilisation très basique de printf mais qui me suffira . Autrement c’est plutôt orienté « programmeur » il me semble et là je sors une floppée de jokers .

en tout cas merci pour les renseignements , en particulier sur les limites des indications données par le manuel « man » au sujet de bash .