J'écris souvent des scripts shell KSH qui suivent le même modèle:
- (1) récupérer la sortie d'une ou plusieurs commandes
- (2) formatez-le en utilisant grep | cut | awk | sed et imprimez-le à l'écran ou dans un fichier
Pour ce faire, je stocke souvent la sortie de (1) dans un fichier temporaire, puis je fais le formatage en (2) sur ce fichier.
Prenez ce code par exemple:
TMPFILE=file.tmp
# If tmpfile exists rm it.
[ -f $TMPFILE ] && rm -f $TMPFILE
for SERVICE in $(myfunc); do
getInfo $SERVICE > $TMPFILE # Store raw output in the TMPFILE
# I retrieve the relevant data from the TMPFILE
SERV_NAME=$(head -1 $TMPFILE | sed -e 's/ $//')
SERV_HOSTNAME=$(grep HOSTNAME $TMPFILE | cut -d "=" -f2)
SERV_ARGS=$(grep Arguments $TMPFILE | cut -d ":" -f2)
print $SERV_NAME $SEP $SERV_HOSTNAME $SEP $SERV_ARGS
rm -f $TMPFILE #rm the TMPFILE in vue of next iteration
done
Existe-t-il un moyen, en utilisant des canaux, des redirections et autres joyeusetés, d'éviter d'écrire un fichier sur le disque à chaque fois?
Si cela aide, j'utilise la version ksh M-11/16 / 88i
PATH
ou d'autres variables shell ou d'environnement.TMPFILE
peut être bien, maisTMPDIR
c'est spécial, alors voulez-vous vraiment marcher sur la corde raide?Réponses:
Votre code ressemble à un exemple entièrement justifié d'utilisation de fichiers temporaires pour moi. Je resterais: respectez cette approche. La seule chose qui doit vraiment être modifiée est la façon dont vous créez le fichier temporaire. Utilisez quelque chose comme
ou
ou au moins
De cette façon, vous ne laisserez pas le nom être facilement prédit (sécurité) et éliminerez les interférences de règles entre plusieurs instances du script s'exécutant en même temps.
la source
var=$(echo lots of spaces); echo "$var"
est très bien et devrait produirelots of spaces
en sortie. La vraie mise en garde que personne n'a mentionnée est la substitution de commandes supprime toutes les nouvelles lignes de fin. Ce n'est pas un problème ici, et ne compte que si, par exemple, vous avez eu un cassémktemp
qui a créé des noms de fichiers avec des retours à la ligne de fin. Si nécessaire, le travail habituel estvar=$(echo command with trailing newline; echo x); var=${var%x}
.Vous pouvez utiliser une variable:
De
man ksh
:Les avantages comprennent:
la source
man
page (il n'y avait aucune mention du numéro de version sur la page Web: /)<<<
est bash 'here string'. Je ne pense pas qu'il apparaisse dans un autre shell. (Oh,zsh
peut - être ...)man ksh
. Cela a certainement été mentionné là-bas.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- oui, il utilise un fichier temporaire.Vous avez deux options:
Vous récupérez les données une fois (dans votre exemple avec
getInfo
) et les stockez dans un fichier comme vous le faites.Vous récupérez les données à chaque fois et ne les stockez pas localement, c'est-à-dire que vous appelez à
getInfo
chaque foisJe ne vois pas le problème de la création d'un fichier temporaire pour éviter le retraitement / la récupération.
Si vous craignez de laisser le fichier temporaire quelque part, vous pouvez toujours l'utiliser
trap
pour être sûr de le supprimer au cas où le script serait tué / interrompuet utilisez
mktemp
pour créer un nom de fichier unique pour votre fichier temporaire.la source
Au lieu de générer un fichier, construisez des instructions d'affectation de shell et évaluez cette sortie.
Ou si vous souhaitez simplement imprimer les informations:
la source