Comentando cadeias de comandos de várias linhas?

2

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?

    
por Philip Kirkbride 21.11.2017 / 19:21

3 respostas

4

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 $( ... ) .

    
por 21.11.2017 / 19:28
2

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 ';' )
    
por 15.12.2018 / 18:39
0

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.

    
por 21.11.2017 / 20:00

Tags