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

supprimer code erreur commande bash

40 réponses
Avatar
Christophe PEREZ
Bonjour,

Y a-t-il mieux, pour supprimer le code d'erreur (pas le message) d'une
commande bash que "commande || true" ?

Pour que ma demande ne semble pas trop surprenante à ceux qui aiment
toujours remettre en cause le bienfondé des questions, c'est pour mettre
dans une configuration de système de sauvegarde (bacula) du genre :

bash -c 'ls -d /repertoire/qui/peut/ne/pas/exister || true'

dans une config générique qui sert à toutes les machines, mais qui pour
certaines renvoie une erreur (sans le || true) si le chemin n'existe pas,
mais surtout, interrompt totalement l'ensemble de la sauvegarde.

Ça m'évite de faire une config par machine, plus compliqué à maintenir,
sans toutefois être obligé de créer ces répertoires vides, juste pour que
la sauvegarde n'échoue pas.

Mais s'il n'y a pas mieux/plus propre que le "|| true", je laisse comme
ça.

10 réponses

1 2 3 4
Avatar
Stéphane CARPENTIER
Le 26-07-2020, Christophe PEREZ a écrit :
Le Sat, 25 Jul 2020 22:50:12 +0000, Stéphane CARPENTIER a écrit :
Ben si, de faire un test sur l'existence du répertoire avant de lancer
la commande.

Et non faire un test n'a pas d'intérêt, puisque ce n'est pas une
condition au lancement de la sauvegarde ou pas.
JE veux juste que si le répertoire existe, il soit sauvegardé, et que
s'il n'existe pas, il ne le soit évidemment pas, mais qu'il n'y ait pas
de code d'erreur pour ne pas empêcher la sauvegarde de TOUT LE RESTE.

J'ai bien compris ce que tu demandais. J'explique la raison de ma
réponse dans l'autre message que je viens de poster.
Donc je persiste à dire que mon option est la bonne. Et je voulais juste
savoir si le || true pour le faire était correct. Mais vu que personne
n'a finalement proposé mieux, c'est que ça l'est.

Après tu fais ce que tu veux. C'est toi qui vois si les autres
possibilités d'erreurs sont à prendre en compte ou pas.
--
Si vous avez du temps à perdre :
https://scarpet42.gitlab.io
Avatar
Nicolas George
Stéphane CARPENTIER , dans le message
, a écrit :
C'est pour ça que je te dis que tu peux tester l'existence du
répertoire. Si, pour une raisons quelconque, bacula n'a plus les droits
de lire le contenu du répertoire, tu auras aussi une erreur. Sauf que si
tu supprimes le code d'erreur quoiqu'il arrive, tu assumeras que la
sauvegarde échoue parce que ton répertoire n'existe pas. Et il ne sera
jamais sauvegardé. Il y a plein d'autres raisons pour lesquelles la
commande peut échouer. Par exemple, tu peux perdre le réseau. La seule
que tu veux bypasser, c'est celle qui correspond au répertoire
inexistant. C'est pour ça que je dis que tester la raisons avant de
considérer que c'est ça me semble préférable.

Excellent argument.
D'une manière générale, plus quelque chose est important, plus il faut être
spécifique quand on l'automatise.
Avatar
Benoit Izac
Bonjour,
Le 26/07/2020 à 18:50, Christophe PEREZ a écrit dans le message
<rfkc7s$u9k$ :
Mieux, je ne pense pas, plus court, oui :

Quand je dis "mieux", je veux dire "plus convenable/correct", pas
forcément plus court.

J'ai bien compris et c'est justement pourquoi j'ai précisé.
commande;:

Hu ? Qu'est-ce ?

Tu exécutes « commande » puis, quelque soit son code de retour, tu
exécutes « : » qui ne fait rien et renvoie 0 (comme « true » donc).
--
Benoit Izac
Avatar
Marc SCHAEFER
Jo Engo wrote:
Le Sun, 26 Jul 2020 16:50:04 +0000, Christophe PEREZ a écrit :
$ false;:
$ echo $?
0

Toutefois:
:~$ /tmp/bla
:~$ cat /tmp/bla
#! /bin/bash
set -e
false;:
echo ok # ne s'affiche pas à cause du `set -e'
Mais pas de souci avec la variante || true ( ou || : )
Avatar
Nicolas George
Marc SCHAEFER , dans le message <rfkilv$or6$, a
écrit :
set -e
false;:
echo ok # ne s'affiche pas à cause du `set -e'

Évidemment, puisque set -e travaille instruction par instruction. Mais
l'outil de backup de Christophe ne verra que le code de retour de l'ensemble
de la commande donnée.
Avatar
Christophe PEREZ
Le Sun, 26 Jul 2020 17:20:48 +0000, Nicolas George a écrit :
Ta phrase contient un « si », c'est bien qu'un test est la solution
adaptée.

Mmmmhhh à part que le sinon est "rien".
if [ -d $dir ]; then ls -d $dir; fi

à part que mon $dir est du genre
/le/dir/*/*/est/multiple/fichier_en_question
J'ai du mal à voir toutes les implications à tous les niveaux
Avatar
Christophe PEREZ
Le Sun, 26 Jul 2020 17:24:42 +0000, Stéphane CARPENTIER a écrit :
J'ai bien compris ce que tu demandais. J'explique la raison de ma
réponse dans l'autre message que je viens de poster.

Oui, j'ai bien vu, et je t'en remercie.
Après tu fais ce que tu veux. C'est toi qui vois si les autres
possibilités d'erreurs sont à prendre en compte ou pas.

C'est bien la question que je me pose "à cause" ou "grâce" à vous selon
la conclusion ;)
A priori, et vous l'aurez compris, j'ai tendance à dire que je ne vois
aucun impact, mais ça se réfléchi.
bacula tourne en root, donc pas de pb de permission.
Et il tourne sur le client, donc pas de pb de réseau. Et s'il y a pb
réseau, le serveur ne lancera pas la sauvegarde, donc toujours pas un
problème.
Et s'il y a un problème réseau, c'est d'ailleurs que j'ai l'erreur.
Je vais réfléchir à tout ça à tête reposée, et je verrai ce que j'en
conclue.
Merci à tous.
Avatar
Christophe PEREZ
Le Sun, 26 Jul 2020 19:55:52 +0200, Benoit Izac a écrit :
Tu exécutes « commande » puis, quelque soit son code de retour, tu
exécutes « : » qui ne fait rien et renvoie 0 (comme « true » donc).

Ah oui, ok, donc ça revient au même que le true, ou il y a une nuance ?
Avatar
Benoit Izac
Bonjour,
Le 26/07/2020 à 21:47, Christophe PEREZ a écrit dans le message
<rfkmks$2cc$ :
Tu exécutes « commande » puis, quelque soit son code de retour, tu
exécutes « : » qui ne fait rien et renvoie 0 (comme « true » donc).

Ah oui, ok, donc ça revient au même que le true, ou il y a une nuance ?

Pas vraiment à part que « : » est toujours un builtin du shell alors que
true peut-être une commande externe (mais je pense que tous les shells
actuels l'ont en builtin).
Dans SUSv4
<https://pubs.opengroup.org/onlinepubs/9699919799/utilities/true.html>,
on peut lire :
RATIONALE
The true utility has been retained in this volume of POSIX.1-2017,
even though the shell special built-in : provides similar
functionality, because true is widely used in historical scripts and
is less cryptic to novice script readers.
--
Benoit Izac
Avatar
Nicolas George
Christophe PEREZ , dans le message <rfkmat$2cc$, a
écrit :
J'ai du mal à voir toutes les implications à tous les niveaux

Dans ce cas, c'est ÇA qu'il faut corriger. Sinon tu ne pourras jamais avoir
confiance en tes sauvegardes.
1 2 3 4