Что на самом деле делает переменная SECONDS?

Проблема с вашим подходом в два -раза:

  • Синтаксис команды lnln -s <original file> <link>, поэтому она должна быть
ln -s../en/reference-file.tsx./new-file.tsx
  • Команда lnсоздает файл связи, поэтому не должно быть предварительно -существующего файла с именем <link>.

В вашем случае удаление (пока еще пустого)new-file.tsxи выполнение приведенной выше команды должно выполнить задачу.

0
25.04.2021, 07:27
3 ответа

Из справочной страницы bash:

SECONDS

Each time this parameter is referenced, the number of seconds since shell invocation is returned. If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned. If SECONDS is unset, it loses its special properties, even if it is subsequently reset.

Таким образом, установив SECONDSв 1, вы перезапустите счетчик, который теперь начинается с 1 и удваивается с каждой итерацией цикла while, потому что переменная SECONDSувеличивается на прошедшее время, давая вам красивую геометрическую последовательность sleep.

+ SECONDS=1
+ true
+ echo hello
hello
+ sleep 1
+ true
+ echo hello
hello
+ sleep 2
+ true
+ echo hello
hello
+ sleep 4
+ true
+ echo hello
hello
...
3
28.04.2021, 22:51

В данном случае $SECONDSравно

  1. ужасное имя переменной; это сбивает с толку Bash, построенный -за «СЕКУНДЫ».
  2. — аргумент команды sleep.

Команда sleepпо умолчанию использует секунды. Присвоив SECONDSзначение 1, а затем передав его команде sleep, он приостанавливает обработку цикла while на 1 секунду, затем повторно -обрабатывает цикл и т. д. до тех пор, пока не будет выполнено условие.

Чтобы проверить это, просто откройте терминал, введите sleep 1и нажмите ENTER.Оболочка сделает паузу на 1 секунду, а затем вернет вам курсор.

-2
28.04.2021, 22:51

Обычно значение SECONDS используется для тайм-аута длительной -запущенной задачи. Это более точно, чем подсчет итераций цикла, поскольку позволяет избежать дрейфа, вызванного временем, затрачиваемым на повторяющуюся задачу :

.
EXPIRED=$(( SECONDS + 5000 ))
while (( SECONDS < EXPIRED )); do
    #.. some repeated task.
    sleep 30
done

Если вы делаете такие вещи, назначение SECONDS в любом месте вашего скрипта небезопасно, --лучше оставить все остальные интервалы относительно исходного времени начала. В качестве альтернативы вы можете изначально установить SECONDS как что-то более полезное для вас, например. секунд с полуночи текущего дня, что было бы полезно, если вы также хотите синхронизировать повторяющуюся задачу со следующей целой единицей времени с помощью sleep $(( 60 - SECONDS % 60 )).

Чтобы инициализировать SECONDS в секундах -с -полуночи, я обнаружил:

SECONDS=$(( $( date '+ 3600 * %H + 60 * %M + %S' ) ))

Подоболочки довольно специфичны. Они наследуют SECONDS своей родительской оболочки в качестве экспорта, поэтому они могут изменить его (, например. обнуляется ), но родитель не видит этих изменений. Отдельные -сценарии оболочки начинаются заново с SECONDS=0.

3
28.04.2021, 22:51

Теги

Похожие вопросы