Для цикла и команды locate с несовпадающим регулярным выражением

Найдите устаревшую запись монтирования на сервере NFS:

showmount -a | grep ip_address_of_nfs_client

Если вы видите строки, связанные с IP-адресом клиента NFS и общим ресурсом, который вы пытаетесь смонтировать, удалите устаревшие записи из rmtab:

vi /var/lib/nfs/rmtab

Перезагрузите rpc.mountd, чтобы он увидел новый rmtab:

killall rpc.mountd ; /usr/sbin/rpc.mountd
0
08.04.2021, 09:30
1 ответ

Обратные кавычки требуют большего экранирования. Это одна из причин, по которой вы должны предпочесть$()(см., например. «обратная косая черта» в этом ответе:В чем разница между $(stuff)и `stuff`?).

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

Измените соответствующую строку на:

for file in $(locate --regex '^.*\.original$' | grep test); do

Примечания:

  • Я использовал одинарные -кавычки для удобства обработки обратной косой черты и звездочки. В вашем исходном коде звездочка без кавычек и без экранирования может вызвать расширение имени файла .

  • ^.*в регулярном выражении ничего не меняет. Одного -в кавычках \.original$было бы достаточно. Я решил оставить ^.*только для того, чтобы указать на возможность расширения имени файла.

  • Привыкайте к цитированию переменных(например.echo "$file"). Связанный ответ также рекомендует цитировать $(), но в нашем цикле forцитирование было бы неправильным.Не цитировать $()тоже неправильно. Оба неверны, потому что…

  • Вообще построение forтаких петель часто бывает неправильным . Это ловушка Баша номер один . Чтобы что-то сделать с выводом locate, лучше направить его в xargs, предпочтительно в виде строк, заканчивающихся нулем -:

    .
    locate -0 … | grep -z … | xargs -r0 …
    

    Эти параметры не переносимы.

4
28.04.2021, 22:53

Теги

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