Isso parece funcionar no Bash, dash
, etc:
#!/bin/sh
seq 20 | # make a long list
grep '[234]' # mut only take part of it
Da mesma forma, com &&
ou ||
no lugar do canal e também dentro de $( ... )
.
Muitas vezes tenho código onde formato fazendo longas declarações AND / OR. Por exemplo:
# Get wifi router gateway
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
Às vezes, uma única etapa em um comando, como acima, pode ser complexa. Assim, acabo querendo comentar isso.
Por exemplo, digamos que o comando cut
foi mais complicado do que realmente é aqui. Então eu quero fazer 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 \;)
Sei que isso é uma sintaxe inválida.
Mas estou curioso para ver se alguém mais tem algumas estratégias para comentar longas cadeias de comandos?
A única coisa que faz com que seu comando tenha uma sintaxe inválida é o fato de que você escapa desnecessariamente das novas linhas em cada linha.
Seu comando,
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
é idêntico a
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers | cut -d' ' -f5 | tr --delete \;)
Em outras palavras, do ponto de vista do shell, não é um comando de várias linhas.
Inserindo um comentário antes que o cut
torne a substituição do comando não finalizada (o% final)
é recomendado):
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers # Here is a note | cut -d' ' -f5 | tr --delete \;)
No entanto, não há necessidade de escapar das novas linhas. O código a seguir é totalmente válido:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
| cut -d' ' -f5
| tr --delete \;)
Aqui, é muito bom inserir um comentário:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
# Here is a note
| cut -d' ' -f5
| tr --delete \;)
É bom fazer isso porque cada parte de um pipeline pode ser seguida por uma ou várias novas linhas, e um comentário é ignorado pelo analisador do shell.
Olhando para o código , esta é uma variante mais segura e portátil (exceto a inicial grep
que ainda requer o uso de extensões não padrão):
gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
| grep -F 'option routers'
# Here is a note
| cut -d ' ' -f 5
| tr -d ';' )
Além disso, zsh
, que pode emular o bash (apenas chamá-lo como bash ou executar emulate bash
), na verdade suporta comandos de várias linhas !
Basta executar bindkey -e
ou bindkey "^[^M" self-insert-unmeta
e, em seguida, você pode ir para uma nova linha pressionando M-Return.
Ele é salvo como uma entrada de histórico; você pode se movimentar com as teclas de seta como seria de esperar. Ele só irá mudar as entradas quando você subir / descer na linha superior / inferior.
Tags bash