Открыть дескриптор файла в Bash в режиме перезаписи - PullRequest
0 голосов
/ 25 ноября 2018

Я открываю дополнительные дескрипторы файлов в моем скрипте Bash с помощью

Reproducer="reproducer.sh"
exec 3<> $Reproducer

. Затем его можно использовать, например, с echo

echo "#! /bin/bash" >&3
echo "echo This is a reproducer script." >&3

Источник: Как работают файловые дескрипторы?

Как я заметил после многих попыток, открытый файл перезаписывает существующее содержимое файла.Если новый контент больше, он расширит файл, но если у нового контента будет меньше байтов, старый контент останется в конце файла.

В моем случае это создаст сломанный скрипт, потому чтоЯ пишу сценарий Bash.

Есть ли в операторе exec 3<> file возможность обрезать файл при открытии?


Альтернативные решения:

  • удалить файл перед открытием с помощью rm $Reproducer.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Одна из вещей, которую вы можете сделать, это создать временный файл и заменить старый на этот.

exec 3<>/tmp/script
printf "%s\n" "#!/bin/bash" >&3
printf "%s\n" "printf \"This is a reproducer script.\n\"" >&3
exec 3>&-
mv /tmp/script "${Reproducer}"

Вы получите две вещи:

  • Ваш новыйВ конце скрипта не останется мусора;
  • Если процесс завершится неудачно до завершения, вы не удалите предыдущий скрипт и все равно сможете восстановить частично созданный файл.
0 голосов
/ 25 ноября 2018
exec 3>$Reproducer

Должно работать, если вам не нужно читать файл.в этом случае:

exec 3>$Reproducer 4<$Reproducer

и вы читаете из файлового дескриптора 4.

...