Как правильно осуществить подмену (копирование) скрипта в самом скрипте?

Как в bash-скрипте, который выполняется при старте, можно избежать порчи самого себя при копировании файла, чтобы устройство правильно загружалось?
  • 2 октября 2023 г. 14:27
Ответы на вопрос 2
Для осуществления подмены (копирования) скрипта в самом скрипте вам понадобится использовать временный файл или временную директорию для сохранения исходного скрипта, чтобы избежать порчи самого себя при копировании. 

Один из способов сделать это в bash-скрипте можно описать следующим образом:

1. Создайте временный файл или временную директорию, куда будете копировать исходный скрипт. Например, вы можете использовать mktemp для создания временного файла:

```bash
temp_file=$(mktemp)
```

2. Скопируйте исходный скрипт во временный файл или временную директорию:

```bash
cp "$0" "$temp_file"
```

3. Выполните копию временного файла или временной директории вместо исходного скрипта. Например, если вы скопировали скрипт во временный файл, вы можете запустить его следующим образом:

```bash
bash "$temp_file"
```

4. После выполнения скрипта вы можете удалить временный файл или временную директорию:

```bash
rm "$temp_file"
```

При таком подходе исходный скрипт будет запущен из временного файла или временной директории, исключая возможность порчи самого скрипта при копировании.
Когда cp или mv заменяют открытый кем-то файл, исходный файл сохраняется без изменений. Получается, что это просто замена указателя на файловый дескриптор. Чтобы решить проблему с "порчением" файла, необходимо разобраться в деталях происходящего. Непонятно, что именно происходит - флешка вынимается без размонтирования или копирование файлов не происходит. Рекомендуется скопировать скрипт во временный файл medteco.sh.tmp, а затем переименовать его после успешного копирования. Можно также добавить проверку контрольной суммы для повышения надежности. Однако, прежде всего необходимо выяснить причину "порчения" файла.
Похожие вопросы