Como tornar um pipe de script de shell ciente

-2

Eu tenho o seguinte script:

#!/bin/sh

[ "${#}" -eq "0" ] && (printf "%s\n" "${0}: word ..." >&2; exit 1)

_whats()
{
    [ -z "${1}" ] && return 1
    [ -z "${2}" ] && more_than_one="1"

    for word; do
        response="$(dig +short txt ${word}.wp.dg.cx)"
        printf "%s\n" "${response}"
        if [ -z "${more_than_one}" ]; then
            printf "\n%s\n\n" ":::::::::::::::::::::::::::::::::::::::::"
        fi
    done
}

_whats "${@}"

Funciona muito bem quando eu chamo assim:

whats shell\ script dns #it ouputs two definitions (shell script and dns)

No entanto, eu também chamaria assim:

echo shell\ script dns | whats

Estou acostumado a isso, todos os outros comandos unix podem fazer isso, como você o implementaria em um script de shell?

    
por Javier López 26.04.2014 / 21:28

1 resposta

0

Depois de ler as seguintes referências:

Eu editei o script acima da seguinte forma:

#!/bin/sh

if [ ! -t 0 ]; then
    #there is input comming from pipe or file, add to the end of $@
    set -- "${@}" $(cat)
fi

[ "${#}" -eq "0" ] && (printf "%s\n" "${0}: word ..." >&2; exit 1)

_whats()
{
    [ -z "${1}" ] && return 1
    [ -z "${2}" ] && more_than_one="1"

    for word; do
        response="$(dig +short txt ${word}.wp.dg.cx)"
        printf "%s\n" "${response}"
        if [ -z "${more_than_one}" ]; then
            printf "\n%s\n\n" ":::::::::::::::::::::::::::::::::::::::::"
        fi
    done
}

_whats "${@}"

O que concatenará args + stdin em $ @, então agora ele funcionará nos seguintes cenários:

whats dns script #it outputs two definitions
echo dns script | whats #same outputs as above
echo dns script | whats ip #outputs ip, dns and script definition in that order

Ele irá analisar corretamente espaços com eles vieram como args

whats shell\ script dns #output two definitions

Mas não quando esses parâmetros são passados por um canal:

echo shell\ script dns | whats #output three definitions

No entanto, esse é um problema que outros utilitários unix também têm (-print0, -0, etc), então eu posso viver com isso.

    
por Javier López 27.04.2014 / 21:49