В настоящее время я читаю книгу о программировании на Bash, Pro Bash Programming. В одной главе (Глава 4) они спрашивают, с какой проблемой связан следующий скрипт. Я сам понятия не имею после прочтения. Я должен что-то здесь упустить. Кто-нибудь может показать мне, в чем проблема?

year=$( date +%Y )
month=$( date +%m )
day=$( date +%d )
hour=$( date +%H )
minute=$( date +%M )
second=$( date +%S )

4 ответа4

3

Что делать, если вы запускаете эти команды 31 декабря в 23:59:59, и часы переводятся в следующую секунду после, скажем, месяца?

безопаснее:

read year month day hour minute second < <( date "+%Y %m %d %H %M %S" )

Будьте осторожны, если вы используете эти значения для арифметики: оболочка считает 08 и 09 недействительными восьмеричными числами, а не действительными десятичными числами.

1

У меня нет настоящей ошибки в скрипте. Но вполне возможно, что при чтении всей строки по отдельности вы, наконец, читаете «второе» значение, которое не соответствует «минуте» до этого, потому что оно уже изменилось ...

0

Одна вещь, которую я заметил, заключается в том, что небезопасно предполагается, что все 6 вызовов на date будут выполняться в одну и ту же секунду. Представьте, что может произойти, если сценарий попадет на первую строку около 2015-12-31 23:59:59.999 (плюс или минус несколько микросекунд)?

0

Я случайно знаю эту книгу. Прочтите главу 9, и вы найдете раздел о настройке нескольких переменных с помощью одной команды. Там они объяснят, что здесь происходит.

В сущности это а) неэффективно (дата звонка довольно дорогая) и б) рискованно по причинам, указанным jcoppens.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .