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.
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?
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.
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 $@"
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.
Tags solaris shell-script function