2016-02-18 6 views
0

У меня есть сценарий:Одновременные команды

#!/bin/bash 

date +%T & 
Hours=`date +"%H"` & 
Minutes=`date +"%M"` & 
Seconds=`date +"%S"` 

echo "$Hours:$Minutes:$Seconds" 

Цель состоит в том, чтобы echo date два раза, а затем вынимать часы, минуты, секунды и вычислить, сколько секунд прошло между этими двумя командами. Поэтому мое решение состоит в том, чтобы записывать часы, минуты, секунды в переменные, а затем работать с этими переменными.

Проблема: echo только эхо-секунды, что означает, что моя интерпретация & неверна.

  1. Как исправить проблему &? Мне нужно, чтобы эти команды запускались одновременно, поэтому я могу проверить.

  2. date +%s, по-видимому, не будет работать на некоторых входах как:

Wed Mar 4 10:34:59 2015 Wed Mar 4 10:35:08 2015

Даст результат 00:00:01 вместо 00:00:09 или:

Wed Mar 4 10:34:59 2015 Wed Mar 4 17:43:08 2015

даст результат 12:13:14 вместо 07:08:09. Это правда? Или я могу использовать date +%s, а затем уменьшить эти два выхода?

+0

Это похоже на классическую проблему [XY] (https: //meta.stackexchange.ком/вопросы/66377/что-это-The-ху-проблема). Вы действительно хотите узнать, как рассчитать продолжительность чего-то (фактическая проблема, «X»), но вы спрашиваете, как запускать несколько команд даты одновременно (ваше решение «Y»). –

+0

Задания в фоновом процессе ограничены этим процессом. Они не отображаются в вызывающем скрипте. Кроме того, нет необходимости запускать «дату» в фоновом режиме; это не займет много времени. – chepner

ответ

2

Вам не нужно запускать команды одновременно. Выполнить только одну команду:

read hours minutes seconds < <(date '+%H %M %S') 

Но это может быть еще проще: просто использовать формат +%s, чтобы получить количество секунд с начала эпохи. Вы получите два номера, которые вы можете смело вычесть.

#!/bin/bash 
start=$(date +%s) 
sleep 10 
end=$(date +%s) 

echo The command took $((end - start)) seconds. 

Самый простой способ - использовать переменную оболочки $ SECONDS.

При каждом обращении к этому параметру возвращается количество секунд после вызова оболочки. Если для SECONDS присвоено значение, значение, возвращаемое после последующих ссылок, равно количеству секунд с момента присвоения плюс присвоенное значение . Если SECONDS не настроен, он теряет свои особые свойства, даже если впоследствии сбрасывается.

+0

Запустив «набор» команд одновременно, я просто хотел проверить, правильно ли вытащил релевантную информацию из вывода (ака, если я вытащил правильные секунды). А о '+% s' я просто не был уверен из-за примечания в пункте 2. –

+1

@HichigayaHachiman:' +% s' и '+% S' совершенно разные. – choroba

+2

Если все ОП выполняет вычисление продолжительности, я бы использовал bash '' $ SECONDS' вместо –

-1

основная проблема заключается в том, что в этом случае команда date будет выполняться раз дерева, чтобы получить значение ..

так что вам не нужно выполнять дату commad слишком много раз

#!/bin/bash 

#date +%T & 
function myTime(){ 

now=`date +"%H:%M:%S" &` 
} 

myTime 
s1=`echo $now | cut -d":" -f2` 
myTime 
s2=`echo $now | cut -d":" -f2` 

echo "s1[$s1] - s2[$s2]" 

Затем вы можете применить правила для проверки времени прошло

с уважением

Claudio

+0

downvote? Зачем?? – ClaudioM

+0

Я не спустил вниз, но в этом ответе много плохой практики: ненужные фоновые процессы, неэффективное использование 'echo | cut', используя глобальную переменную, backquotes вместо '$ (...)' ... – chepner

Смежные вопросы