In uno script di shell ...
Come posso catturare lo stdin in una variabile senza rimuovere le nuove righe finali?
In questo momento ho provato:
var=`cat`
var=`tee`
var=$(tee)
In tutti i casi $varnon avrà la nuova riga finale del flusso di input. Grazie.
ANCHE: Se non è presente una nuova riga finale nell'input, la soluzione non deve aggiungerne una .
AGGIORNAMENTO ALLA LUCE DELLA RISPOSTA ACCETTATA:
La soluzione finale che ho usato nel mio codice è la seguente:
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"
Se desideri vedere il codice completo, consulta la pagina github per expandr , uno script di shell di filtro di espansione delle parole chiave git open source che ho sviluppato per motivi di sicurezza delle informazioni. In base alle regole impostate nei file .gitattributes (che possono essere specifici del ramo) e git config , git reindirizza ogni file attraverso lo script della shell expandr.sh ogni volta che lo si fa dentro o fuori dal repository. (Questo è il motivo per cui è stato fondamentale preservare eventuali nuove righe finali o la loro mancanza.) Ciò consente di ripulire le informazioni sensibili e scambiare in diversi set di valori specifici dell'ambiente per test, stadiazione e rami attivi.
filter, aggiungerà i caratteri di nuova riga alla fine di tutti i flussi di input che inizialmente non terminavano in nuove righe. In effetti, in origine l'ho fatto, filterma mi sono imbattuto in quel problema che mi ha portato a questa soluzione perché né "aggiungere sempre nuove righe" né "eliminare sempre le nuove righe" sono soluzioni accettabili.
sedprobabilmente farà la nuova riga extra - ma dovresti gestirlo filternon con tutto il resto. E tutte quelle funzioni che hai sostanzialmente fanno la stessa cosa: a sed s///. Stai usando la shell per reindirizzare i dati che ha salvato nella sua memoria in sedmodo da sedpoter sostituire quei dati con altri dati che la shell ha archiviato nella sua memoria in modo da sedpoter reindirizzare alla shell. Perché non solo [ "$var" = "$condition" ] && var=new_value? Inoltre non ottengo gli array: stai memorizzando il nome dell'array e [0]poi lo usi sedper sostituirlo con il valore in [1]? Forse chattare?
filter? Funziona perfettamente così com'è. Per quanto riguarda il funzionamento del codice sul mio collegamento e il motivo per cui l'ho impostato come ho fatto, sì, ne parliamo in una chat room.
filterprendestdin- corresed. Si catturastdinnel$GIT_INPUTquindi stampare che di nuovo astdoutpiù di un tubo perfiltere prendere la suastdoutin$FILTERED_OUTPUTe quindi stampare di nuovo astdout. Tutte le 4 linee nella parte inferiore del vostro esempio di cui sopra potrebbero essere sostituiti con proprio questo:filter. Senza offesa intendevo qui, è solo che ... stai lavorando troppo duramente. Non hai bisogno delle variabili della shell per la maggior parte del tempo, basta dirigere l'input nel posto giusto e trasmetterlo.