Проблема с вашим подходом в два -раза:
ln
— ln -s <original file> <link>
, поэтому она должна быть ln -s../en/reference-file.tsx./new-file.tsx
ln
создает файл связи, поэтому не должно быть предварительно -существующего файла с именем <link>
. В вашем случае удаление (пока еще пустого)new-file.tsx
и выполнение приведенной выше команды должно выполнить задачу.
Из справочной страницы 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
...
В данном случае $SECONDS
равно
sleep
. Команда sleep
по умолчанию использует секунды. Присвоив SECONDS
значение 1
, а затем передав его команде sleep
, он приостанавливает обработку цикла while на 1 секунду, затем повторно -обрабатывает цикл и т. д. до тех пор, пока не будет выполнено условие.
Чтобы проверить это, просто откройте терминал, введите sleep 1
и нажмите ENTER
.Оболочка сделает паузу на 1 секунду, а затем вернет вам курсор.
Обычно значение 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.