Комментирование многострочных цепочек команд?

Комментирование многострочных цепочек команд?

У меня часто есть код, в котором я форматирую, делая длинные операторы И/ИЛИ. Например:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

Иногда один шаг в команде, подобной выше, может быть сложным. Поэтому я в конечном итоге хочу прокомментировать его.

Например, скажем, cutкоманда была сложнее, чем она есть на самом деле. Поэтому я хочу сделать что-то вроде:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            # Here is a note
            | cut -d' ' -f5 \
            | tr --delete \;)

Я понимаю, что это неверный синтаксис.

Но мне интересно, есть ли у кого-нибудь еще стратегии комментирования длинных цепочек команд?

решение1

Кажется, это работает в Bash dashи т. д.:

#!/bin/sh
seq 20 |       # make a long list
grep '[234]'   # mut only take part of it

Аналогично с трубой &&или ||вместо нее, а также внутри $( ... ).

решение2

Единственное, что делает синтаксис вашей команды недействительным, — это тот факт, что вы без необходимости экранируете символы новой строки в каждой строке.

Ваша команда,

gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

идентичен

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  | cut -d' ' -f5 | tr --delete \;)

Другими словами, с точки зрения оболочки, это вообще не многострочная команда.

Вставка комментария перед этим cutделает подстановку команды незавершенной (последний )рекомендуется исключить):

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  # Here is a note | cut -d' ' -f5 | tr --delete \;)

Однако экранировать новые строки не нужно. Следующий код полностью корректен:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            | cut -d' ' -f5
            | tr --delete \;)

Здесь вполне можно вставить комментарий:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            # Here is a note
            | cut -d' ' -f5
            | tr --delete \;)

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


Глядя на реальныйкод, это более безопасный и переносимый вариант (за исключением первоначального grep, который по-прежнему требует использования нестандартных расширений):

gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
            | grep -F 'option routers'
            # Here is a note
            | cut -d ' ' -f 5
            | tr -d ';' )

решение3

Кроме того, zsh, который может эмулировать bash (просто назовите его bash или запустите emulate bash), на самом деле поддерживаетмногострочные команды!

Просто запустите bindkey -eили bindkey "^[^M" self-insert-unmeta, а затем вы можете перейти на новую строку, нажав M-Return.

Он сохраняется как одна запись истории; вы можете перемещаться с помощью клавиш со стрелками, как и ожидалось. Он будет переключать записи только при перемещении вверх/вниз в верхней/нижней строке.

Связанный контент