Czytelne komentarze na temat oddzielnych linii w wieloliniowym poleceniu bash z potokami?

14

Podczas tworzenia skryptów powłoki przy użyciu potoków i używania odwrotnego ukośnika do kontynuowania linii, chcę wstawiać komentarze do oddzielnych linii w solidny, czytelny i przenośny sposób.

Na przykład, biorąc pod uwagę to niekomentowane polecenie wieloliniowe (skradzione z @DigitalRoss ze względu na jego przejrzystość):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... poniżej jest estetycznie najbliżej tego, co chcę osiągnąć, ale z oczywistych powodów nie działa ... i tak, jestem w pełni świadomy, że nie jest to zwykle coś wartego komentarza:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

Istniejące powiązane odpowiedzi wydają mi się niezadowalające :

Po pierwsze, odpowiedź Glenna Jackmana (dodawanie argumentów do tablicy, a następnie wykonanie tablicy) działa dla pojedynczych poleceń, ale nie działa w przypadku potokowania (a nawet jeśli tak, dodaje złożoności, której chciałbym uniknąć).

Po drugie, odpowiedź @Gilles tutaj (która używa :) również nie wydaje się działać z potokowaniem, ponieważ zmienia przepływ potoku:

$ echo "abc" | :
$

( UWAGA : Jeśli istnieje odpowiednik, :który przekazuje dane wyjściowe bez modyfikacji, byłoby to estetycznie dopuszczalne, ale nie udało mi się go znaleźć. Mógłbym napisać niestandardowy, ale zmniejszyłby przenośność.)

Wreszcie ostatnia część odpowiedzi DigitalRoss na StackOverflow działa dobrze w przypadku dodawania komentarzy w tej samej linii, ale zdecydowanie wolę komentarze w osobnych liniach. W przeciwnym razie, gdy linie mają bardzo różne długości, zmniejsza się czytelność:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

Szukam odpowiedzi, które zachowają czytelność i zminimalizują złożoność, lub też pewne tło, dlaczego to, czego szukam, jest niemożliwe.

Royce Williams
źródło
1
Uwaga na temat twoich komentarzy: Nauczono mnie pisać komentarze wyjaśniające część lub jednostkę pracy. Jeśli doświadczony programista pisze inteligentne komentarze opisujące to, co robią, to prawdopodobnie każdy, kto będzie utrzymywał skrypt, może zawsze korzystać ze stron podręcznika, jeśli nie rozumie szczegółów użycia. Nigdy nie należy pisać takich komentarzy i++; // increment i by one. Proponuję przeczytać „Elementy stylu programowania”
bsd,
Myślę, że zamierzam usunąć ostatnią zmianę. To niezwykłe, że pytanie zawiera pytanie, obalenie odpowiedzi i samą odpowiedź, ale część, która wyjaśnia, dlaczego inne odpowiedzi nie działają, jest w tym przypadku niezbędna. odpowiedź rozcietrzewiacz i twój komentarz razem wyjaśniają problem (osobiście napisałbym osobną odpowiedź i zaakceptował ją, ponieważ problem był dość różny od tego, co opisał, ale to działa)
Michał Mrożek
Zrozumiane - dzięki za opinie; wyciągnięta lekcja!
Royce Williams

Odpowiedzi:

14

Co powiesz na to?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(Ukośnik odwrotny musi być użyty jako ostatni znak w tych wierszach.) Nie jestem pewien, czy to podejście jest przenośne, ale z pewnością działa z prądem bash.

rozcietrzewiacz
źródło
Aha! (facepalm) Przekształciłem idiom, którego faktycznie używałem, zamieszczając pytanie, nie zdając sobie z tego sprawy! Umieszczałem fajkę na początku każdej linii, co z przyjemnością przestaję robić, skoro wiem, że ta metoda działa dobrze na wszystkich systemach, do których mogę dotrzeć, zarówno w bash, jak i sh. Dzięki!
Royce Williams
Czy te komentarze nie zrujnują kontynuacji linii?
Stuart P. Bentley,
Tak długo, jak przed każdym komentarzem jest pusta linia, działa dobrze.
Royce Williams