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 $var
non 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, filter
ma 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.
sed
probabilmente farà la nuova riga extra - ma dovresti gestirlo filter
non 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 sed
modo da sed
poter sostituire quei dati con altri dati che la shell ha archiviato nella sua memoria in modo da sed
poter 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 sed
per 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.
filter
prendestdin
- corresed
. Si catturastdin
nel$GIT_INPUT
quindi stampare che di nuovo astdout
più di un tubo perfilter
e prendere la suastdout
in$FILTERED_OUTPUT
e 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.