Imprime o comando nth pipeline no bash

1

Em bash , a matriz PIPESTATUS contém os valores de retorno dos comandos em um pipeline.

Suponha que no pipeline cmd1 | cmd2 | cmd3 , o segundo comando retorne um erro. A verificação de PIPESTATUS fornece o índice do comando com falha, mas como alguém pode imprimir o nome do próprio comando, cmd2 ?

Seria bom mostrar os argumentos para cmd2 , mas aceitarei uma resposta que apenas imprima o nome do comando.

    
por Nathaniel M. Beaver 14.03.2015 / 07:50

1 resposta

2
# put commands in an array, e.g.: cat /etc/passwd | grep 1555 | grep sh
cmd=("cat /etc/passwd" "grep 1555" "grep sh")

# execute commands
eval "${cmd[0]}" | eval "${cmd[1]}" | eval "${cmd[2]}"

# save PIPESTATUS
save=("${PIPESTATUS[@]}")

# print returncode and failed command
for ((i=0;i<${#save[@]};i++)); do
  [[ ${save[$i]} -ne 0 ]] && echo "${save[$i]}: ${cmd[$i]}"
done

unset save cmd

Saída (por exemplo):

1: grep 1555
1: grep sh
    
por 14.03.2015 / 08:48