
A menudo tengo código en el que formato haciendo declaraciones AND/OR largas. Por ejemplo:
# Get wifi router gateway
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
A veces, un solo paso en un comando como el anterior puede resultar complejo. Así termino queriendo comentarlo.
Por ejemplo, digamos que el cut
comando era más complicado de lo que realmente es aquí. Entonces quiero hacer algo como:
# 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 \;)
Me doy cuenta de que esta es una sintaxis no válida.
Pero tengo curiosidad por ver si alguien más tiene algunas estrategias para comentar cadenas de comandos largas.
Respuesta1
Esto parece funcionar en Bash dash
, etc.:
#!/bin/sh
seq 20 | # make a long list
grep '[234]' # mut only take part of it
Lo mismo con &&
o ||
en lugar de la tubería, y también en el interior $( ... )
.
Respuesta2
Lo único que hace que su comando tenga una sintaxis no válida es el hecho de que escapa innecesariamente de las nuevas líneas en cada línea.
Tu comando,
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
es idéntico a
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers | cut -d' ' -f5 | tr --delete \;)
En otras palabras, desde el punto de vista del shell, no es en absoluto un comando de varias líneas.
Insertar un comentario en esto antes de que la cut
sustitución del comando no finalice ( )
se recomienda el final):
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers # Here is a note | cut -d' ' -f5 | tr --delete \;)
Sin embargo, no es necesario escapar de las nuevas líneas. El siguiente es un código totalmente válido:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
| cut -d' ' -f5
| tr --delete \;)
Aquí está bien insertar un comentario:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
# Here is a note
| cut -d' ' -f5
| tr --delete \;)
Está bien hacer esto porque cada parte de una canalización puede ir seguida de una o varias líneas nuevas, y el analizador del shell ignora un comentario.
Mirando lo realcódigo, esta es una variante más segura y portátil (excepto la inicial grep
que aún requiere el uso de extensiones no estándar):
gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
| grep -F 'option routers'
# Here is a note
| cut -d ' ' -f 5
| tr -d ';' )
Respuesta3
Además, zsh
que puede emular bash (simplemente llámelo bash o run emulate bash
), en realidad admitecomandos multilínea!
Simplemente ejecute bindkey -e
o bindkey "^[^M" self-insert-unmeta
y luego podrá ir a una nueva línea presionando M-Return.
Se guarda como una entrada del historial; Puedes moverte con las teclas de flecha como es de esperar. Solo cambiará las entradas cuando suba/baje en la fila superior/inferior.