A menudo escribo scripts de shell KSH que siguen el mismo patrón:
- (1) recuperar la salida de uno o más comandos
- (2) formatee con grep | cut | awk | sed e imprímalo en la pantalla o en un archivo
Para hacer eso, a menudo almaceno la salida de (1) en un archivo temporal, y luego hago el formato en (2) en ese archivo.
Tome ese código por ejemplo:
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
¿Hay alguna manera, usando tuberías, redirecciones y otras cosas, para evitar escribir un archivo en el disco cada vez?
Si ayuda, estoy usando ksh Versión M-11/16 / 88i
PATH
u otras variables de entorno o shell.TMPFILE
puede estar bien, peroTMPDIR
es especial, entonces, ¿realmente quieres caminar por la cuerda floja?Respuestas:
Su código parece un ejemplo completamente justificado de usar archivos temporales para mí. Me quedaría: seguir con este enfoque. Lo único que realmente necesita ser cambiado es la forma en que crea el archivo temporal. Usa algo como
o
o al menos
De esta manera, no permitirá que el nombre se prediga fácilmente (seguridad) y excluya la interferencia de la regla entre varias instancias del script que se ejecutan al mismo tiempo.
fuente
var=$(echo lots of spaces); echo "$var"
está bien y debe producirlots of spaces
como salida. La advertencia real que nadie mencionó es que la sustitución de comandos elimina todas las nuevas líneas finales. Esto no es un problema aquí, y solo importa, por ejemplo, si tuvo un nombre rotomktemp
que creó nombres de archivo con líneas nuevas. La solución habitual, si es necesario, esvar=$(echo command with trailing newline; echo x); var=${var%x}
.Puedes usar una variable:
De
man ksh
:Las ventajas incluyen:
fuente
man
página correcta (no se mencionó el número de versión en la página web: /)<<<
es bash 'aquí cadena'. No creo que aparezca en ningún otro caparazón. (Oh,zsh
tal vez ...)man ksh
. Ciertamente fue mencionado allí.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- sí, usa un archivo temporal.Tienes dos opciones:
Usted recupera los datos una vez (en su ejemplo con
getInfo
) y los almacena en un archivo como lo hace.Obtiene los datos cada vez y no los almacena localmente, es decir, llama
getInfo
cada vezNo veo el problema al crear un archivo temporal para evitar el reprocesamiento / recuperación.
Si le preocupa dejar el archivo temporal en algún lugar, siempre puede usarlo
trap
para asegurarse de eliminarlo en caso de que el script sea eliminado / interrumpidoy úselo
mktemp
para crear un nombre de archivo único para su archivo temporal.fuente
En lugar de generar un archivo, construya sentencias de asignación de shell y evalúe esa salida.
O si solo desea imprimir la información:
fuente