Читання коментарів до окремих рядків у багаторядковій команді bash з конвеєрами?


14

Створюючи сценарії оболонок за допомогою конвеєрів і використовуючи зворотний косий ривок для продовження рядків, я хочу вставляти коментарі на окремі рядки в надійному, читабельному та портативному режимі.

Наприклад, враховуючи цю некоментовану багаторядкову команду (викрадена у @DigitalRoss для її чіткості):

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

... нижче є естетично найближче до того, що я хочу досягти, але з очевидних причин не виходить ... і так, я добре розумію, що це звичайно не варто коментувати:

# 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

Існуючі відповідні відповіді для мене виглядають незадовільно :

По-перше, відповідь Глена Джекмана (додавання аргументів до масиву, а потім виконання масиву) працює для одиночних команд, але не працює для конвеєра (і навіть якщо це було, це додає складності, яку я хотів би уникнути).

По-друге, відповідь @Gilles тут (яка використовує :) також не працює з конвеєрним трубопроводом, оскільки це змінює потік трубопроводу:

$ echo "abc" | :
$

( ПРИМІТКА . Якщо є еквівалент, :який передає вихід немодифікований, це було б естетично прийнятним, але я не зміг його знайти. Я міг би написати спеціальну, але це зменшило б мобільність.)

Нарешті, остання частина відповіді DigitalRoss про StackOverflow добре працює для додавання коментарів до того ж рядка, але я дуже віддаю перевагу коментарям в окремих рядках. В іншому випадку, коли рядки мають різну довжину, читабельність знижується:

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

Я шукаю відповіді, які зберігають читабельність та мінімізують складність, а то й інше, чому те, що я шукаю, неможливо.


1
Зверніть увагу на ваші коментарі: мене вчили писати коментарі, пояснюючи розділ чи одиницю роботи. Якщо досвідчений кодер пише розумні коментарі з описом того, що вони роблять, то, імовірно, кожен, хто бере участь у підтримці сценарію, завжди може використовувати довідкові сторінки, якщо не розуміє деталей використання. Ніколи не слід писати такий коментар i++; // increment i by one. Пропоную прочитати "Елементи стилю програмування"
bsd

Я думаю, я збираюся видалити останню редакцію. Тут незвично, щоб питання містило запитання, спростування відповідей та саму відповідь, але частина необхідної тут пояснює, чому інші відповіді не працюють. Відповідь rozcietrzewiacz і ваш коментар разом пояснюють проблему (особисто я б опублікував окрему відповідь і прийняв її, оскільки проблема була досить відрізняється від описаної, але це працює)
Майкл Мрозек

Зрозумів - дякую за відгуки; урок вивчений!
Royce Williams

Відповіді:


14

Як щодо цього?

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

# Sort the results.
sort | \

# Only show unique lines.
uniq

(Звороту косу рису потрібно використовувати як останній символ у цих рядках.) Я не впевнений у переносимості цього підходу, але він впевнено працює з поточним bash.


Ага! (facepalm) Я перетворив ідіому, якою я фактично користувався, коли розміщував питання, не усвідомлюючи цього! Я накладав трубу на початку кожного рядка, що я радий перестати робити зараз, коли знаю, що цей метод добре працює на всіх системах, до яких я можу дійти, як в bash, так і в sh. Спасибі!
Royce Williams

Чи не будуть ці коментарі руйнувати продовження лінії?
Стюарт П. Бентлі

Поки перед кожним коментарем є порожній рядок, він працює чудово.
Ройс Вільямс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.