Jak wypisać zmienną bez zmiany, jeśli ma ona nową linię w skrypcie powłoki?

1

Mam skrypt powłoki, który pobiera dane z innego skryptu powłoki. Strumień zostanie przesłany na stdin.

Muszę przechwycić wszystkie bajty strumienia standardowego do pojedynczej zmiennej w skrypcie powłoki. Następnie wykonaj na nim kilka operacji i wyślij go z powrotem na standardowe wyjście.

Mam problem z tym, że czasami w pliku wejściowym pojawia się kończący znak nowego wiersza, ale czasami nie ma. Jeśli nie, to nie chcę dodawać. Jeśli jednak istnieje nowa linia, chcę to zachować.

Problem polega na tym, że bez względu na to, co próbuję, system albo zawsze wyświetla BEZ końcowego znaku nowej linii (jak w przypadku printf ) lub zawsze wyświetla Z nową linią (jak w przypadku echo ).

Proszę mi powiedzieć, jaka jest nazwa procesu (nie echo lub printf ), który po prostu pobiera zmienną i wysyła ją, dosłownie, bajt na bajt, na standardowe wyjście. Wypróbowałem wszystkie możliwe opcje dla printf i żaden z nich nie działa, aby zachować końcowe znaki nowej linii.

Dzięki.

CommaToast
źródło
Wierzę, że zapytałeś dobrze pytanie, kiedy zapytałeś Jak przechwycić stdin do zmiennej bez usuwania końcowych linii? Wierzę, jak wskazałeś w tym innym pytaniu , że jeśli przeczytasz stdin i zapiszesz go w zmiennej powłoki, wszelkie końcowe znaki nowej linii zostaną w tym momencie usunięte. Tak więc nie ma możliwości, aby jakiekolwiek polecenie rozróżniało dwa przypadki po tym. ………… P.S. Nie publikuj prawie identycznych pytań jednocześnie na wielu stronach Exchange Stack (np. Super User i U & amp; L).
G-Man

Odpowiedzi:

0

echo -e "$ var" będzie wyprowadzaj końcowe znaki nowej linii. Może zapomniałeś cytatów? Zawsze pokazuj, co próbowałeś, zadając takie pytania.

wurtel
źródło
0

Ostateczne rozwiązanie, którego użyłem w moim kodzie, jest następujące:

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"
CommaToast
źródło