
У меня часто есть код, в котором я форматирую, делая длинные операторы И/ИЛИ. Например:
# 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.
Он сохраняется как одна запись истории; вы можете перемещаться с помощью клавиш со стрелками, как и ожидалось. Он будет переключать записи только при перемещении вверх/вниз в верхней/нижней строке.