#!/bin/bash
в начало скрипта Вы можете принудительно использовать нужную оболочку с помощью первой строки :#!/bin/bash
, что является еще одним способом сделать то, что вы делаете с помощьюbash./myscript...
#!/bin/bash
...
...
source "/opt/config/test.config"
...
...
Нет source
встроенной -команды в оболочкеsh
(и нет программы с именемsource
). Поэтому, если ваш скрипт запускается с помощью sh
, он завершится ошибкой в командной строке с source
.
Практически невозможно сослаться на файл по его индексному узлу. Чтобы открыть файл, необходимо открыть ссылку на имя файла в каталоге. Затем у вас есть дескриптор файла, который теперь не зависит от имени файла (, поэтому файл может быть удален из файловой системы, но при этом оставаться открытым и активным ). Итак, давайте предположим, что файл остается открытым на протяжении всего жизненного цикла приложения. Теперь вам нужно заменить содержимое этого файла, используя rsync
.
Обычно rsync
создает временную копию целевого файла вместе с любым существующим экземпляром, а затем в последний момент удаляет (или создает резервную копию )оригинала и включает замену. Это поведение можно изменить с помощью опции --inplace
, так что вместо создания новой копии rsync
будет выполнять запись в реальную цель.
Теперь вы также указали --backup
, так что rsync
поступает правильно и создает копию для резервной копии, прежде чем позволить --inplace
обновить исходный экземпляр. Вы можете увидеть это на коротком примере:
# Prepare scenario
mkdir /tmp/624404
cd /tmp/624404
date >src
cp -p src dst
# Initial files, with inodes
ls -li src dst
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:49 src
# Update, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src
# Update again, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src
Вы видите, что целевой(dst
)файл по-прежнему имеет исходный индексный дескриптор, но резервной копии был присвоен новый индексный дескриптор. Второе обновление показывает, что после этого индексные дескрипторы сохраняются.
В вашем случае кажется, что --inplace --backup
— это то, что вам нужно. Однако обратите внимание, что справочная страница предупреждает:
WARNING: you should not use this option to update files that are being accessed by others, so be careful when choosing to use this for a copy.
Причина того, что --inplace
не является значением по умолчанию, заключается в том, что прерванное частичное копирование может оставить целевой файл в несогласованном состоянии,и автор (s )решил, что лучше иметь внутренне непротиворечивый исходный -из -файл даты, чем поврежденный -из -файл даты. Такое поведение можно изменить с помощью таких флагов, как --inplace
и--partial
(и даже --append
с rsync
версии 3.0.0 и выше ).