Как сохранить прошедшее время назначения переменной другой переменной в скрипте bash? - PullRequest
1 голос
/ 20 января 2020

Я хотел запустить команду maven и сохранить вывод консоли в переменную и, в свою очередь, сохранить время real упомянутой операции в другой переменной. Я написал следующую команду -

x1=`( time t1=$( mvn test -Drat.skip)) 2>&1 | grep real`

Когда я echo переменная x1, я получаю 0m17.430s, который является желаемым выводом, но когда я echo переменная t1, она ничего не печатает! Как я могу сохранить вывод консоли mvn test -Drat.skip в t1?

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Все внутри () или обратных кавычек происходит в подоболочке. Значения переменных не экспортируются из подоболочки обратно в родительскую оболочку.

Вы можете назначить как вывод команды, так и вывод time в переменную, а затем извлечь ее оттуда:

#!/bin/bash
all=$((time mvn test -Drat.skip )2>&1)
time=$(tail -n3 <<< "$all" | grep real)
output=$(head -n-3 <<< "$all")
1 голос
/ 20 января 2020

Как сказал @choroba t1 создан в другом подоболочке и не может быть экспортирован обратно. Вы можете проверить это следующим образом:

t1=test
x1=`(time t1=$(echo ok); echo $t1) 2>&1`
echo $t1
echo $x1

Вывод будет:

$ echo $t1
test

$ echo $x1
real 0m0,001s user 0m0,001s sys 0m0,001s ok

Но этот небольшой взлом может помочь

fun () { t1=$(mvn test -Drat.skip); }
x1=$((time fun) 2>&1 | grep real)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...