En un script de shell ...
¿Cómo capturo stdin a una variable sin quitar ninguna línea nueva?
En este momento he intentado:
var=`cat`
var=`tee`
var=$(tee)
En todos los casos $var
no tendrá la nueva línea final de la secuencia de entrada. Gracias.
TAMBIÉN: Si no hay una nueva línea final en la entrada, entonces la solución no debe agregar una .
ACTUALIZACIÓN A LA LUZ DE LA RESPUESTA ACEPTADA:
La solución final que utilicé en mi código es la siguiente:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Si desea ver el código completo, consulte la página de github para expandr , un pequeño script de shell de filtro de expansión de palabras clave git de código abierto que desarrollé para fines de seguridad de la información. De acuerdo con las reglas establecidas en archivos .gitattributes (que pueden ser específicos de la rama) y git config , git canaliza cada archivo a través del script de shell expandr.sh cada vez que lo ingresa o sale del repositorio. (Es por eso que fue fundamental preservar las nuevas líneas finales, o la falta de ellas). Esto le permite limpiar información confidencial e intercambiar diferentes conjuntos de valores específicos del entorno para pruebas, puesta en escena y ramas vivas.
filter
, agregará caracteres de nueva línea al final de cualquier flujo de entrada que inicialmente no termine en nuevas líneas. De hecho, originalmente lo hice, filter
pero me encontré con ese problema que me llevó a esta solución porque ni "agregar nuevas líneas" ni "siempre quitar nuevas líneas" son soluciones aceptables.
sed
probablemente hará la nueva línea adicional, pero debe manejar eso filter
no con todo el resto. Y todas esas funciones que tienes básicamente hacen lo mismo: a sed s///
. Está utilizando el shell para canalizar los datos que ha guardado en su memoria, de sed
modo que sed
podría reemplazar esos datos con otros datos que el shell haya almacenado en su memoria para sed
poder volver a canalizarlos al shell. ¿Por qué no solo [ "$var" = "$condition" ] && var=new_value
? Tampoco obtengo las matrices: ¿está almacenando el nombre de la matriz y [0]
luego lo sed
reemplaza con el valor [1]
? Tal vez chatear?
filter
? Funciona perfectamente como está. Con respecto a cómo funciona el código en mi enlace y por qué lo configuré de la manera en que lo hice, sí, hablemos de ello en una sala de chat.
filter
tomastdin
, corresed
. Se capturastdin
en la$GIT_INPUT
continuación de impresión que de nuevo astdout
través de una tubería defilter
y coger sustdout
en$FILTERED_OUTPUT
y luego imprimirlo de nuevo astdout
. Todas las 4 líneas en la parte inferior de su ejemplo anterior podría ser reemplazado con sólo esto:filter
. Sin ofender aquí, es solo que ... estás trabajando muy duro. No necesita las variables de shell la mayor parte del tiempo, solo dirija la entrada al lugar correcto y páselo.