Как сделать блокировку файла из сценария оболочки? [duplicate]

Поскольку вы на самом деле не меняете строку" cast ":

sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
                set trans_id 1
n;d}' file

Как комментирует Кусалананда, эта команда :

  • при нахождении одной из требуемых "приведенных" строк:
    • a вставьте новую строку
    • возьмите n ext строка из файла (нежелательная строка "set")
    • и d elete it

Оглядываясь назад, это не подтверждает, что строка удаления - это та, которую вы хотите удалить. Я бы изменил это на:

sed '
    /cast \$recv \$UE_CAPABILITY_ENQUIRY/ {
        n
        /set trans_id \[ string range \$recv 42 43 \]/ {
            i\
                set trans_id 1
            d
        }
    }
' file

Для файлов рекурсивно:

find . type f | xargs sed -i '' -e '...'

Более безопасно с инструментами GNU

find . type f -print0 | xargs -0 sed -i '' -e '...'
3
10.09.2016, 10:48
1 ответ

Помимо блокировки самого файла, вы можете создать файл, используемый как блокировку (файл блокировки). Для этого есть множество утилит, например procmail имеет файл блокировки , а в Debian пакет liblockfile-bin имеет файл блокировки . Procmail должен быть достаточно распространенным, чтобы быть доступным в большинстве систем.

Но в основном это сводится к примерно так:

tempfile=$(mktemp ./lock.XXXX)
lockfile=./lockfile
if ln $tempfile $lockfile ; then
    echo got it
    # do something
    rm $lockfile # after you're done
else 
    echo did not succeed
fi
rm $tempfile

ln не будет сбивать цель, если она уже существует, в отличие от чего-то вроде echo> file , вместо этого вы получите сообщение об ошибке, которое вы можете проверить .

ПРИМЕЧАНИЕ: , если вы хотите блокировать NFS , используйте какой-нибудь инструмент, созданный для этой цели. Семантика одновременного доступа к файлам через NFS ... по меньшей мере интересна.

9
27.01.2020, 21:15

Теги

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