Mam skrypt „myscript”, który wyświetla następujące informacje:
abc
def
ghi
w innym skrypcie wywołuję:
declare RESULT=$(./myscript)
i $RESULT
otrzymuje wartość
abc def ghi
Czy istnieje sposób na zapisanie wyniku w znaku nowej linii lub znaku „\ n”, aby można go było wyświetlić za pomocą „ echo -e
”?
Odpowiedzi:
W rzeczywistości RESULT zawiera to, czego chcesz - aby zademonstrować:
To, co pokazujesz, to:
Jak zauważono w komentarzach, różnica polega na tym, że (1) podwójnie cytowana wersja zmiennej (
echo "$RESULT"
) zachowuje wewnętrzne odstępy wartości dokładnie tak, jak jest ona reprezentowana w zmiennej - nowe linie, tabulatory, wiele pustych miejsc i wszystko - podczas gdy (2 ) wersja bez cudzysłowu (echo $RESULT
) zastępuje każdą sekwencję jednego lub więcej spacji, tabulatorów i znaków nowej linii pojedynczą spacją. Tak więc (1) zachowuje kształt zmiennej wejściowej, podczas gdy (2) tworzy potencjalnie bardzo długi pojedynczy wiersz wyjściowy ze „słowami” oddzielonymi pojedynczymi spacjami (gdzie „słowo” jest sekwencją znaków innych niż spacje; potrzeba nie może zawierać żadnych znaków alfanumerycznych w żadnym ze słów).źródło
Inną pułapką jest to, że zastępowanie poleceń -
$()
- usuwa końcowe znaki nowej linii. Prawdopodobnie nie zawsze jest to ważne, ale jeśli naprawdę chcesz zachować dokładnie to , co zostało wydrukowane, musisz użyć innej linii i cytowania:Jest to szczególnie ważne, jeśli chcesz obsłużyć wszystkie możliwe nazwy plików (aby uniknąć niezdefiniowanego zachowania, takiego jak operowanie na niewłaściwym pliku).
źródło
pwd=`pwd`; ls $pwd/$file
, to przed linią masz nowy wiersz/
, a umieszczenie nazwy w podwójnych cudzysłowach nie pomogło. Zostało to naprawione szybko. To było w przedziale czasowym 1983-5 na ICL Perq PNX; powłoka nie miała$PWD
wbudowanej zmiennej.Jeśli interesują Cię określone wiersze, użyj tablicy wyników:
źródło
readarray
i proces zastępowania zamiast podstawienia polecenia:readarray -t RESULT < <(./myscript>
.Oprócz odpowiedzi udzielonej przez @ l0b0 miałem właśnie sytuację, w której musiałem zarówno zachować wszystkie końcowe znaki nowej linii przez skrypt i sprawdzić kod powrotu skryptu. Problem z odpowiedzią l0b0 polega na tym, że „echo x” resetuje $? powrót do zera ... więc udało mi się wymyślić to bardzo przebiegłe rozwiązanie:
źródło
die ()
funkcję, która akceptuje dowolny kod wyjścia i opcjonalnie wiadomość, i chciałem użyć innejusage ()
funkcji do dostarczenia wiadomości, ale nowe linie były ciągle miażdżone, mam nadzieję, że to pozwala mi obejść to.Po wypróbowaniu większości rozwiązań tutaj najłatwiejszą rzeczą, jaką znalazłem, była oczywistość - użycie pliku tymczasowego. Nie jestem pewien, co chcesz zrobić z wyjściem wieloliniowym, ale możesz sobie z tym poradzić, czytając. Jedyną rzeczą, której tak naprawdę nie można zrobić, to łatwo umieścić to wszystko w tej samej zmiennej, ale dla większości praktycznych celów jest to o wiele łatwiejsze.
Szybki hack, aby wykonać żądaną akcję:
Uwaga: dodaje to dodatkową linię. Jeśli nad tym popracujesz, możesz go zakodować, jestem po prostu zbyt leniwy.
EDYCJA: Chociaż ten przypadek działa idealnie dobrze, osoby czytające to powinny mieć świadomość, że możesz łatwo zgnieść swoje standardowe wejście w pętli while, dając w ten sposób skrypt, który uruchomi jedną linię, wyczyści standardowe wejście i zakończy działanie. Jak ssh zrobi to, co myślę? Właśnie to widziałem, inne przykłady kodu tutaj: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
Jeszcze raz! Tym razem z innym uchwytem pliku (stdin, stdout, stderr to 0-2, więc możemy używać & 3 lub wyższej w bash).
możesz także użyć mktemp, ale to tylko szybki przykład kodu. Użycie mktemp wygląda następująco:
Następnie użyj $ filenamevar, tak jak rzeczywista nazwa pliku. Prawdopodobnie nie trzeba tu wyjaśniać, ale ktoś narzekał w komentarzach.
źródło
bash
pułapek .read
rozszerzenia polecenia-u 3
do odczytu z deskryptora pliku 3.Co powiesz na to, odczytuje każdą linię do zmiennej i można z niej później korzystać! powiedzmy, że wyjście myscript jest przekierowywane do pliku o nazwie myscript_output
źródło