Status de execução separado dos comandos canalizados

0

Em um comando em que temos muitos tubos redirecionando ainda mais suas saídas, existe alguma maneira de saber o valor de echo $? até a metade de sua execução ou até certo número de pipes, em oposição ao status geral de o comando inteiro? Para exemplificar, estou executando o comando abaixo para obter o carimbo de data / hora do arquivo a ser convertido em seu tempo de época,

'ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9|date --date - +%s'

Mas não entendo o que eu quero, como eu verifiquei manualmente, dividindo-o em duas metades como,

var1='ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9'
var2='date --date=$var1 +%s'

No primeiro comando ininterrupto eu ainda estou recebendo uma saída sem nenhum erro e não é algo que estou esperando, mas eu não quero nem usar dois comandos também. Alguém poderia sugerir de qualquer maneira para fazê-lo ou exatamente onde estou errando?

Atualização: Por que o abaixo produziria a época da meia-noite de hoje (o que acontece se a data tiver sido fornecida - para obter a saída antecipada canalizada - embora isso não funcione dessa maneira) A primeira questão permanece sem resposta também.

-bash-3.2$ ls -lrt --time-style=+"%b %d %Y %H:%M:%S" *.dat|head -1|tr -s " "|cut -d " " -f9|date --date - +%s; date +%s
1429056000      #Midnight's
1429093077      #Current

PS: Não foi a época atual.

    
por Keyshov Borate 15.04.2015 / 11:52

2 respostas

1

In a command where we have lot of pipes redirecting their outputs further, is there any way to get to know the value of echo $? till half of it's execution or till certain number of pipes, as opposed to the overall status of the whole command's?

No bash, há uma variável PIPESTATUS , que é uma matriz contendo o status de saída de cada comando no pipeline mais recente.

$ ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /bin/*|head -1|tr -s " "| \
  cut -d " " -f 9|date --date - +%s
1429070400
$ echo ${PIPESTATUS[@]}
141 0 0 141 0
$ kill -l 'expr 141 - 128'
PIPE

Isso nos diz que os comandos ls e cut saíram com um SIGPIPE, o que é esperado porque sua saída não foi completamente consumida pelo próximo comando no pipeline.

In the first unbroken command I'm still getting an output without any error and is not something I'm expecting.

Isso ocorre porque o comando date está funcionando como esperado, mas não da maneira que você espera.

date --date - não lê a data do stdin; em vez disso, ele usa - como a string de data. Não consigo ver onde o significado de um solitário - está documentado, mas parece ser o mesmo que 0 ou 0000 , que significa "meia-noite do dia atual".

    
por 15.04.2015 / 16:25
1

Você tem esse comando

ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9|date --date - +%s

O problema com isso é que date não espera seus parâmetros via stdin , então você precisa dividi-lo em duas partes. Você já tentou isso na segunda parte da sua pergunta:

var1=$(ls -lrt --time-style=+"%b %d %Y %H:%M:%S" /some/path/*.dat|head -1|tr -s " "|cut -d " " -f 9)
echo "var1='$var1'"    # eg var1='11:37:39'
var2=$(date --date="$var1" +%s)
echo "var2='$var2'"    # eg var2='1429094259'

No entanto, quando você executa o comando date , está lhe dando o tempo (11:37:39 - 1429094259) para hoje (compare-o ao valor de var2 com meus 11 : 04: 45 - 1429092286 e verá que são muito semelhantes).

Talvez stat --format '%Y' /tmp/path/*.dat seja mais fácil?

Algumas respostas para perguntas específicas

Existe alguma maneira de conhecer o valor do echo $? [no meio de um tubo]? Não diretamente, não. No entanto, você pode dividir o pipeline em duas partes com um arquivo temporário para manter os resultados intermediários ou salvar o valor de $? à medida que avança.

cmd1 | ( cmd2; SS=$?; echo $SS >/tmp/cmd2.ss; exit $SS ) | cmd3
cmd2_status=$(</tmp/cmd2.ss)

Como posso fazer o que eu quero em um único pipeline? Você pode avaliar o tempo e passar isso até hoje, algo assim

date --date=$( cmd1 | cmd2 | cmd2 ) +%s

Por que date --date=- produz a hora à meia-noite? O comando date está tentando fazer algo significativo com a data inválida "-". Acontece que isso acaba sendo interpretado como "meia-noite hoje". Eu não apostaria nisso, no entanto; se você realmente quiser meia-noite eu vou para um explícito date --date='00:00'

    
por 15.04.2015 / 12:05