Referência ao stdin enviado pelo processo do emissor canalizado

0

Digamos que eu tenha isto:

delete_lock () {
    if grep -q 'PATTERN'; then
        # some command here
    fi
    cat >/dev/null
}

node foo.js | delete_lock

diga que o processo node.js escreve "foodog" para delete_lock, ou envia "sandbag". (Poderia ser qualquer nome único ...)

Como posso ler isso na função delete_lock? delete_lock vai receber algum nome exclusivo e, em seguida, excluir o bloqueio com esse nome do sistema de arquivos ... como posso fazer isso?

A única coisa que posso imaginar é algo assim:

  delete_lock () {
        if grep -q 'lockname:xxx'; then
            release_lock $xxx
        fi
        cat >/dev/null
  }

mas como faço referência a variável $ xxx lol?

    
por Alexander Mills 20.04.2018 / 22:31

1 resposta

1

Estou assumindo que seu xxx é um substituto para um padrão de algum tipo.

delete_lock () {
    LOCK="$(grep -m1 -o "lockname:xxx")"
    if [ -n "${LOCK#lockname:}" ]; then
        release_lock "${LOCK#lockname:}"
    fi
}

node foo.js | delete_lock

Isso interromperá o processamento de dados depois que ele observar a primeira correspondência de lockname:xxx . Em seguida, ele usa a expansão do parâmetro para remover o prefixo lockname: e, supondo que houve uma correspondência (por exemplo, xxx , executa release_lock sobre ele (por exemplo, release_lock "xxx" ).

Se você não quiser que a chamada node seja interrompida ou deseje mais de uma correspondência, remova a opção -m1 para grep , mas observe que as cotações podem não funcionar com sua release_lock código (e tenha cuidado ao remover essas citações, você não quer permitir que caracteres nocivos!).

    
por 21.04.2018 / 00:33