Для одного из моих лабораторных заданий мне нужно «запустить dmesg, используя только команду find».

Я пытался искать и ничего не нашел, вероятно, потому, что это не так, как предполагается использовать.

-1
AdminBee 8 Окт 2021 в 14:12
4
dmesg обращается к кольцу журналов ядра через /dev/kmsg. Я не понимаю, при чем здесь команда find.
 – 
Bib
7 Окт 2021 в 23:13
Я тоже, поэтому вопрос меня смущает, он просто говорит запустить приложение dmesg, используя только команду find.
 – 
user496066
7 Окт 2021 в 23:34
6
"для одной из моих лабораторий" -- вот волшебная причина, та самая, которая позволяет выкинуть весь смысл из окна... Как подсказка, чтобы вы могли повеселиться, разбираясь: find может запускать команды , нет, скажем, он может execубрать их. Ничего не говорит о том, что через него нельзя запустить dmesg. Просто это глупо, и вам все еще нужна оболочка для запуска find, так что вы не будете использовать «только» find. Оболочка + find + dmesg сложнее, чем просто оболочка + dmesg. Если бы это был я, я бы сказал это тому, кто руководит лабораториями, но вы можете быть осторожны с этим...
 – 
ilkkachu
8 Окт 2021 в 00:26
1
Пожалуйста, поясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы выделить именно то, что вам нужно. В настоящее время трудно сказать, о чем вы спрашиваете.
 – 
Community
8 Окт 2021 в 00:41

3 ответа

find $(which find) -exec dmesg \;

Это должно быть одно решение. $(which find) можно заменить на путь к любому файлу, в существовании которого вы уверены. find выполнит команду, предоставленную -exec, для каждого найденного файла (что в нашем случае только один раз).

3
theCalmChameleon 8 Окт 2021 в 01:37
2
Ну... find /dev/kmsg -exec dmesg \; было бы лучше и по делу. Хотя совершенно бессмысленно.
 – 
Bib
8 Окт 2021 в 11:03

Выполнение одиночных команд — это то, что find может сделать, но вы никогда не будете использовать его для выполнения. Это все равно, что придумать одну из тех бесполезных машин, видео которых можно найти на YouTube.

Используя стандартный find, вы можете выполнить dmesg с помощью следующей команды.

find . -prune -exec dmesg \;

В этой команде find мы пытаемся выполнить dmesg, используя -exec для текущего каталога, и мы используем -prune, чтобы избежать поиска чего-либо в текущем каталоге. Поскольку больше нечего исследовать, find завершается.

Команда не зависит от того, какой путь поиска мы даем find, кроме того, что он должен существовать. Это также не зависит от того, разрешено ли текущему пользователю выполнять dmesg или иметь dmesg в своем $PATH. Команда запустит утилиту dmesg почти так же, как если бы она выполнялась непосредственно из командной строки.

2
they 8 Окт 2021 в 15:54
1
Обратите внимание, что оба они зависят от успешного завершения dmesg. ;) Если вы совершите ошибку, запустив find -exec dmesg \; -quit без привилегий на хосте Linux, вы получите полный экран ошибок «dmesg: чтение буфера ядра: операция не разрешена», по одной для каждого файла. Вы можете сделать find . -prune -exec dmesg \;, чтобы избежать этого, так как -prune завершается успешно и не завершается. (Сложнее с -quit, поскольку он завершается немедленно, вам понадобится что-то вроде find . -exec dmesg \; -quit -or quit)
 – 
ilkkachu
8 Окт 2021 в 15:25
Я бы подумал, что успешное выполнение dmesg было обязательным условием задачи. Если это невозможно, задача еще более бесполезна.
 – 
they
8 Окт 2021 в 15:27
Да, конечно, нет смысла запускать dmesg, зная, что это не удастся. Но вообще, наверное, стоит помнить, что -exec — это тоже условие. (конечно, -exec {} + не является, поэтому, если кто-то просто хочет запустить команду для каждого в наборе файлов, с -prune после или без, они могут использовать вариант + и нет проблем.)
 – 
ilkkachu
8 Окт 2021 в 15:47
Обновлено после пересмотра вашего вклада.
 – 
they
8 Окт 2021 в 15:54
1
Я подозреваю, что предпосылка заключается в том, что OP будет иметь доступ только к ограниченной оболочке, где доступен только небольшой набор команд, и одна из таких команд — find, и тот, кто развернул эту ограниченную оболочку, упустил из виду тот факт, что find может выполнять любую команду независимо от того, ограничена ли оболочка find, из которой она вызывается.
 – 
Stéphane Chazelas
8 Окт 2021 в 22:10

Учитывая то, что было написано в комментариях, я думаю, что правильный ответ find / -name dmesg -type f -executable -exec {} \;

0
Bib 9 Окт 2021 в 17:31