Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script bash

28 réponses
Avatar
Didier
Bonjour Í  tou(te)s,

Pourquoi la ligne de commande
« shred --remove --verbose --zero !(*.gpg) »
fait bien ce qu'elle doit,
mais que ça coince quand elle se trouve dans
un script bash ? y a-t-il une parade ?
Le message d'erreur : «
erreur de syntaxe près du symbole inattendu « ( »
/home/didier/bin/gpgc: ligne 9: ` shred --remove --verbose --zero
!(*.gpg)'

»

Librement,
Didier.

--
ma céramique : http://didierdescamps.fr
autres bouts de vie : http://didierdescamps.free.fr
--

10 réponses

1 2 3
Avatar
Olivier Miakinen
Bonjour,
Le 08/06/2021 21:47, Benoit Izac a écrit :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Je ne comprends pas ce qu'est censée faire cette syntaxe, ni ce que ça
fait de différent de :
% uname -s
Linux
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 08/06/2021 22:12, Didier a écrit :
Le 08/06/2021 Í  21:22, Olivier Miakinen a écrit :
ou=$(pwd)

Right!
if [ "${ou:12:3}" = '/.z' ] ; then

[...]

Mais je veux que ça fonctionne aussi dans les sous-répertoires du
consacré secret
~/.z , or pwd retourne /.z et non /.z/ et je ne peux donc pas tester un
16eme caractère.À moins de tester aussi la longueur ? ça risque de se
compliquer alors.

Ah, ok.
Tu peux tester "${ou:12:4}" qui sera égal soit Í  '/.z' soit Í  '/.z/' selon
que la chaÍ®ne s'arrête lÍ  ou continue.
Ou bien tu peux ajouter le / toi-même au $(pwd) avant de tester :
ou=$(pwd)/
if [ "${ou:12:4}" = '/.z/' ] ; then
--
Olivier Miakinen
Avatar
Benoit Izac
Bonjour,
Le 08/06/2021 Í  22:57, pehache a écrit dans le message
 :
ou=`pwd`

La syntaxe avec `...` est désuète et souvent peu lisible (sauf bien
sÍ»r dans un cas aussi simple que `pwd`). Lui préférer la syntaxe
$(...), plus lisible, et qui peut s'imbriquer.

^^^^^^^^^^^^^^^^^^^^^^^
«Â `…` » s'imbrique aussi, c'est juste qu'il faut les échapper.

Et ça peut rapidement devenir totalement illisible, y compris pour
celui qui essaie de l'écrire.

Je n'ai pas dit le contraire, je soulignais juste que l'imbrication
n'est pas spécifique Í  «Â $(…) ».
«Â $(…) » a aussi ses petits problèmes :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Tu te fais éventuellement avoir une ou deux fois avec ça, et après tu
retiens. L'illisibilité des backquote imbriquées par contre elle
reste.

Si tu en es Í  imbriquer plusieurs niveaux, je pense qu'il y a un autre
problème dans ton code.
Que ce soit bien clair, je ne défends pas les «Â `…` », je réagis juste
au fait que l'on pense qu'ils ne s'imbriquent pas ; ce qui est faux.
--
Benoit Izac
Avatar
Benoit Izac
Bonjour,
Le 09/06/2021 Í  00:49, Olivier Miakinen a écrit dans le message
<s9os69$1klo$ :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Je ne comprends pas ce qu'est censée faire cette syntaxe, ni ce que ça
fait de différent de :
% uname -s
Linux

C'est juste un exemple pour démontrer un problème, il ne faut pas
chercher Í  y voir un sens autre que celui de mettre en évidence le
problème.
--
Benoit Izac
Avatar
pehache
Le 09/06/2021 Í  00:49, Olivier Miakinen a écrit :
Bonjour,
Le 08/06/2021 21:47, Benoit Izac a écrit :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Je ne comprends pas ce qu'est censée faire cette syntaxe, ni ce que ça
fait de différent de :
% uname -s
Linux

(...) exécute les commandes dans un subshell
---------------------
$ x=1; (x=2); echo $x
1
---------------------
--
"...sois ouvert aux idées des autres pour peu qu'elles aillent dans le
même sens que les tiennes.", ST sur fr.bio.medecine
Avatar
Marc SCHAEFER
Benoit Izac wrote:
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Je ne comprends pas ce qu'est censée faire cette syntaxe, ni ce que ça
fait de différent de :
% uname -s
Linux

C'est juste un exemple pour démontrer un problème, il ne faut pas
chercher Í  y voir un sens autre que celui de mettre en évidence le
problème.

Je n'ai jamais utilisé `(uname -s)` ni $((uname -s)). Je ne vois pas du
tout d'o͹ cette syntaxe peut venir.
Toujours `uname -s` et plus récemment toujours $(uname -s).
Attention $((4*32+17)) sert Í  faire des calculs.
Donc $((texte)) s'évalue Í  zéro.
Avatar
Marc SCHAEFER
pehache wrote:
(...) exécute les commandes dans un subshell

Ce qui ne sert en général Í  rien.
Si on veut absolument le faire avec $(), alors:
$( (uname -s) )
ou
($(uname -s))
Jamais $((uname -s)) qui s'évalue 0.
Avatar
Didier
Le 09/06/2021 Í  00:59, Olivier Miakinen a écrit :
ou=$(pwd)/
if [ "${ou:12:4}" = '/.z/' ] ; then

simple et efficace, merci !
Avatar
Benoit Izac
Bonjour,
Le 09/06/2021 Í  07:58, Marc SCHAEFER a écrit dans le message
<s9plap$787$ :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Je ne comprends pas ce qu'est censée faire cette syntaxe, ni ce que ça
fait de différent de :
% uname -s
Linux

C'est juste un exemple pour démontrer un problème, il ne faut pas
chercher Í  y voir un sens autre que celui de mettre en évidence le
problème.

Je n'ai jamais utilisé `(uname -s)` ni $((uname -s)). Je ne vois pas du
tout d'o͹ cette syntaxe peut venir.
Toujours `uname -s` et plus récemment toujours $(uname -s).

C'est pour lancer la commande dans un sous-shell. Je t'accorde que pour
uname ça n'a pas d'intérêt mais il y a des situations o͹ ça l'est.
Attention $((4*32+17)) sert Í  faire des calculs.

D'o͹ le problème avec «Â $(…) » qui se contourne aisément :
% echo $((uname -s) )
Linux
% echo $( (uname -s))
Linux
Donc $((texte)) s'évalue Í  zéro.

Tout Í  fait.
--
Benoit Izac
Avatar
Olivier Miakinen
Le 09/06/2021 06:34, Benoit Izac a écrit :
Si tu en es Í  imbriquer plusieurs niveaux, je pense qu'il y a un autre
problème dans ton code.
Que ce soit bien clair, je ne défends pas les «Â `…` », je réagis juste
au fait que l'on pense qu'ils ne s'imbriquent pas ; ce qui est faux.

Ok, je comprends ton point de vue.
Il n'empêche qu'une syntaxe comme "$(basename $(pwd))" reste plus lisible
que n'importe quel équivalent Í  base de backquotes. Et je ne pense pas
que l'on puisse dire qu'il y ait « un problème dans ce code ».
--
Olivier Miakinen
1 2 3