Problema com a função inteira em um script

1

Eu quero detectar serviços on-line de rede / shell no meu Solaris. Eu escrevo o seguinte script para esse propósito:

compare_ser()
{
if [ "$1" != "" ]; then
echo "True" >> Solaris.txt
fi
}
export -f compare_ser
svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c 'compare_ser $@'

quando eu corro svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 echo no terminal, recebo a seguinte saída:

online
online

mas meu script não mostra nada. Qual é o problema dele?

    
por Gohar 14.07.2015 / 12:46

4 respostas

0

Use isto:

svcs network/shell | cut -d' ' -f1 | grep "online" | xargs -n1 -I{} bash -c 'compare_ser {}'

O {} interpola cada valor gerado por xargs . Seu $@ tenta interpolar argumentos de linha de comando - dos quais não há nenhum.

    
por 14.07.2015 / 18:52
1

Eu acredito que há um caminho mais curto:

svcs network/shell | awk '/online/ {system("bash -c \"compare_ser "$1"\"")}'

Caros Downvoters, você pode explicar sua decisão? Você entendeu o que o Linux realmente é? O script acima é um trecho de trabalho e talvez haja milhões de maneiras de fazer o mesmo. Então peço uma explicação.

    
por 14.07.2015 / 19:09
-1

Você pode ter que usar aspas duplas para a string para resolver os parâmetros posicionais.

svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c "compare_ser $@"
    
por 14.07.2015 / 18:42
-1
svcs network/shell | sed -n '/^online /c\
True' >> Solaris.txt

... deve ser praticamente o equivalente.

A razão seu script não mostra nada, porém, é que a função shell é um código shell que deve ser executado por um shell que já o conhece - a função deve primeiro ser declarada no shell em que é executado para funcionar.

Quando você chama xargs , no entanto, você chama um programa que chama outro programa, que é um shell, é claro, mas os novos processos shell que xargs chama para você não são ciente da função de shell definida no seu shell atual.

É claro que você faz export -f , o que funcionaria, talvez, se o seu shell entendesse o que isso significava, mas se você estiver usando ksh em um sistema Solaris - então não. E, de qualquer forma, isso seria um meio ineficiente de atingir o seu objetivo se isso acontecesse.

    
por 14.07.2015 / 21:33