Dans un script shell ...
Comment capturer stdin dans une variable sans supprimer les sauts de ligne de fin?
En ce moment, j'ai essayé:
var=`cat`
var=`tee`
var=$(tee)
Dans tous les cas, $var
il n'y aura pas de nouvelle ligne de fin du flux d'entrée. Merci.
AUSSI: S'il n'y a pas de nouvelle ligne de fin dans l'entrée, la solution ne doit pas en ajouter une .
MISE À JOUR À LA LUMIÈRE DE LA RÉPONSE ACCEPTÉE:
La solution finale que j'ai utilisée dans mon code est la suivante:
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 vous souhaitez voir le code complet, veuillez consulter la page github pour expandr , un petit script shell de filtre d'extension de mot-clé git open-source que j'ai développé à des fins de sécurité de l'information. Selon les règles définies dans les fichiers .gitattributes (qui peuvent être spécifiques à une branche) et git config , git redirige chaque fichier via le script shell expandr.sh chaque fois qu'il est entré ou sorti du référentiel. (C'est pourquoi il était essentiel de conserver les nouvelles lignes ou leur absence.) Cela vous permet de nettoyer les informations sensibles et d'échanger différents ensembles de valeurs spécifiques à l'environnement pour les branches de test, de transfert et actives.
filter
, cela ajoutera des caractères de nouvelle ligne aux extrémités de tous les flux d'entrée qui ne se terminaient pas initialement par des nouvelles lignes. En fait, à l'origine, je venais de le faire, filter
mais je suis tombé sur ce problème qui m'a conduit à cette solution car ni "toujours ajouter des nouvelles lignes" ni "toujours supprimer les nouvelles lignes" ne sont des solutions acceptables.
sed
fera probablement la nouvelle ligne supplémentaire - mais vous devriez gérer cela filter
avec pas tout le reste. Et toutes ces fonctions que vous avez font essentiellement la même chose - a sed s///
. Vous utilisez le shell pour diriger les données qu'il a enregistrées dans sa mémoire sed
afin de sed
remplacer ces données par d'autres données que le shell a stockées dans sa mémoire afin de sed
pouvoir les rediriger vers le shell. Pourquoi pas juste [ "$var" = "$condition" ] && var=new_value
? Je ne reçois pas non plus les tableaux - stockez-vous le nom du tableau dans [0]
puis l'utiliser sed
pour le remplacer par la valeur dans [1]
? Peut-être discuter?
filter
? Cela fonctionne parfaitement tel quel. En ce qui concerne le fonctionnement du code sur mon lien et pourquoi je l'ai configuré comme je l'ai fait, oui, parlons-en dans un salon de discussion.
filter
prendstdin
- il courtsed
. Vous attrapezstdin
dans$GIT_INPUT
puis imprimer ce retour àstdout
plus d' un tuyau pourfilter
et attraper sonstdout
dans$FILTERED_OUTPUT
puis l' imprimer retour àstdout
. Les 4 lignes en bas de votre exemple ci - dessus pourraient être remplacés par ceci:filter
. Aucune infraction ne signifie ici, c'est juste que ... vous travaillez trop dur. Vous n'avez pas besoin des variables shell la plupart du temps - dirigez simplement l'entrée au bon endroit et transmettez-la.