command substition para saída de múltiplas linhas de comando?

3

Como posso fazer o seguinte trabalho de substituição de comandos?

$ time

real    0m0.000s
user    0m0.000s
sys 0m0.000s

$ oldtime="$(time)"
bash: command substitution: line 23: syntax error near unexpected token ')'
bash: command substitution: line 23: 'time)"'

Eu acho que não funciona porque a saída do comando tem várias linhas, porque uma saída de linha funciona:

$ oldtime="$(echo hello)"
$ echo $oldtime
hello
    
por Tim 07.03.2015 / 09:35

2 respostas

1

Não sei ao certo o que você está tentando capturar porque time não grava no stdout:

$ time > tmpfile

real    0m0.000s
user    0m0.000s
sys     0m0.000s

e você não está realmente "sincronizando" nada.

oldtime="$(time echo)"

não lança um erro, mas ainda imprime os tempos para stdout.

Você provavelmente quer fazer algo como

$ oldtime="$( { time ; } 2>&1 )"
    
por 07.03.2015 / 09:46
1

Quando executado em um subshell como esse, talvez você queira usar times . É basicamente a mesma coisa - exceto que, em vez de relatar o tempo de processamento de um pipeline entregue como argumentos, ele relata os tempos de processamento usados por seu shell pai (leia-se: subshell de comando) e todos os seus filhos desde que seu shell pai foi chamado - e ele deve escrever para stdout.

Então você pode fazer:

pipeline_out=$(some | arbitrary | pipeline; times)

... para pegar tudo.

Ou apenas para ver um resumo de uso da sua sessão atual do shell:

times
    
por 07.03.2015 / 10:17

Tags