Параметр grep --exclude не всегда пропускает именованные каналы

Если у вас достаточно RAM памяти ( вы можете попробовать cat / sys / meminfo , чтобы узнать, сколько у вас осталось), затем вы можете удалить раздел подкачки , удалить его ссылки внутри / etc / fstab переместите / dev / sda2 вправо и, наконец, разверните / dev / sda1 .

Вы также можете удалить все содержимое / usr / share / doc

5
07.02.2019, 10:22
2 ответа

почему бы вам не использовать слово «найти»? Получить список ничего, кроме файлов и выполнить поиск по ним:

find /path/to/dir -type f -exec grep pattern {} \;
1
27.01.2020, 20:36

Кажется, grepпо-прежнему открывает файлы, даже если регулярное выражение говорит ему пропустить их:

$ ll
total 4.0K
p-w--w---- 1 user user 0 Feb  7 16:44 pip-fifo
--w--w---- 1 user user 4 Feb  7 16:44 pip-file
lrwxrwxrwx 1 user user 4 Feb  7 16:44 pip-link -> file

(Примечание. :ни у одного из них нет прав на чтение.)

$ strace -e openat grep foo --exclude='pip*' pip-file pip-link pip-fifo
openat(AT_FDCWD, "pip-file", O_RDONLY|O_NOCTTY) = -1 EACCES (Permission denied)
grep: pip-file: Permission denied
openat(AT_FDCWD, "pip-link", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
grep: pip-link: No such file or directory
openat(AT_FDCWD, "pip-fifo", O_RDONLY|O_NOCTTY) = -1 EACCES (Permission denied)
grep: pip-fifo: Permission denied
+++ exited with 2 +++

Предоставление разрешений на чтение, кажется, что он не пытается прочитать их после открытия, если они исключены:

$ strace -e openat grep foo --exclude='pip*' pip-file pip-link pip-fifo
openat(AT_FDCWD, "pip-file", O_RDONLY|O_NOCTTY) = 3
openat(AT_FDCWD, "pip-link", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
grep: pip-link: No such file or directory
openat(AT_FDCWD, "pip-fifo", O_RDONLY|O_NOCTTY^Cstrace: Process 31058 detached
 <detached...>

$ strace -e openat,read grep foo --exclude='pip*' pip-file
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\25\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\r\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260`\0\0\0\0\0\0"..., 832) = 832
openat(AT_FDCWD, "pip-file", O_RDONLY|O_NOCTTY) = 3
+++ exited with 1 +++

$ strace -e openat,read grep foo --exclude='pipe*' pip-file
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\25\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\r\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260`\0\0\0\0\0\0"..., 832) = 832
openat(AT_FDCWD, "pip-file", O_RDONLY|O_NOCTTY) = 3
read(3, "foo\n", 32768)                 = 4
foo
read(3, "", 32768)                      = 0
+++ exited with 0 +++

А так какopenatне вызывался с O_NONBLOCK, само открытие зависает, и grep не доходит до той части, где исключает его из чтения.

Глядя на исходный код, я полагаю, что процесс примерно такой:

  1. Если не рекурсивно, вызовитеgrep_command_line_argдля каждого файла.
  2. Это вызывает grepfile, если не на стандартный ввод.
  3. grepfileвызываетgrepdescпосле открытия файла.
  4. grepdescпроверяет наличие , исключая файл .

При рекурсивном:

  1. grepdirentпроверяет исключение файла перед вызовом grepfile, поэтому сбой openatникогда не происходит.
7
27.01.2020, 20:36

Теги

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