J'essaie d'obtenir la dernière date de modification d'un fichier avec cette commande
TM_LOCAL=`ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
TM_LOCAL a une valeur comme "2012-05-16 23:18" après l'exécution de cette ligne
Je voudrais également vérifier PIPESTATUS pour voir s'il y a une erreur. Par exemple, si le fichier n'existe pas, ls
renvoie 2. Mais $?
a la valeur 0 car il a la valeur de retour de awk
.
Si j'exécute cette commande seule, je peux vérifier la valeur de retour de ls en regardant ${PIPESTATUS[0]}
ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'
Mais $PIPESTATUS
ne fonctionne pas comme je m'y attendais si j'affecte la sortie à une variable comme dans le premier exemple. Dans ce cas, le $PIPESTATUS
tableau n'a qu'un seul élément qui est identique à$?
Donc, la question est, comment puis-je obtenir les deux $PIPESTATUS
et affecter la sortie à une variable en même temps?
Utilisez
set -o pipefail
inbash
pour obtenir le code de sortie non nul le plus à droite dans une séquence de commandes canalisée comme$?
. Deman bash
:Ensuite, vous pouvez simplement y accéder
$?
. Utilisezset +o pipefail
pour désactiver à nouveau.la source
Je suppose que le problème ici est que PIPESTATUS disparaît dans son intégralité dès que vous exécutez une commande. Vous pouvez obtenir le tableau PIPESTATUS complet dans la version bash 2 ou supérieure de cette façon:
Ensuite , l' accès
${status[0]}
,${status[1]}
etc.la source
Le principal problème avec "ce que vous attendez" est qu'une commande dans les guillemets est exécutée dans un sous-shell;
$PIPESTATUS
existe là et le statut renvoyé par m suit les mêmes règles que si vous exécutiez un seul exécutable (ou script shell). Le statut de la commande backquote est leawk
statut le plus à droite ( ).Pour implémenter ce qu'a dit @ Daniel Beck , définissez ainsi l'
pipefail
option dans le sous-shell:TM_LOCAL=`set -o pipefail; ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
maintenant le statut stocké par la$?
suite sera le statut dels
(si différent de zéro).Cependant, je pense qu'un
if [ -f ~/.vimrc ];
test explicite ... serait plus lisible.Vous ne pouvez pas obtenir la sortie dans une variable et la
PIPESTATUS
renvoyer sans fichier temporaire pour la première, ni regroupement de la seconde dans une chaîne.la source
Je voulais envoyer un e-mail à fron cron uniquement si le statut de sortie n'était pas nul
L'astuce est que pour obtenir le stdin pour la fin du pipeline, vous devez le mettre dans un sous-shell - mais cela semble cacher la valeur PIPESTATUS ...
cron de test crache une sortie et sort avec 1 ou 0 ..
MISE À JOUR: le PIPESTATUS n'est pas visible tant que la commande de pipeline n'est pas en cours
la source
Une option consiste à vérifier l'existence de votre fichier avant d'obtenir son heure de modification avec un appel à
stat
. Étant donné questat
renvoie un peu plus que vous le souhaitez dans l'horodatage, vous pouvez le découper en utilisant l'expansion des paramètres.Avec GNU
stat
(par exemple sous Linux), vous pouvez exécuter:Sur Mac OS X et d'autres systèmes BSD, la
stat
syntaxe diffère et peut spécifier un format d'heure:la source
$TM_LOCAL
est sûr. Il n'est sûr que si vous vous attendez à ce qu'il n'ait pas de valeur antérieure. Supposons que la valeur était antérieure2020-02-27 17:14
et qu'il n'y a pas de~/.vimrc
fichier. Vous auriez alors2020-02-27 17
. Je voudrais donc enchaîner ces deux lignes avec un supplément&&
ou (de préférence car ce n'est pas si lisible) utiliser uneif
strophe.