Как следующая команда работает в Linux, есть ли способ показать загруженные файлы в оболочке?

echo exit | strace bash -li |& less | grep '^open'

Результат:

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/dev/tty", O_RDWR|O_NONBLOCK)     = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
...
0
Bruno Wego 20 Янв 2019 в 03:55

2 ответа

Лучший ответ

В macOS вы можете использовать этот немного другой набор команд:

sudo bash -c "echo exit | dtruss bash -li 2>&1 | less | grep '^open'"

Или, если у вас версия bash 4 или 5:

sudo bash -c "echo exit | dtruss bash -li |& less | grep '^open'" 

(Как указано там в разделе комментариев)

Заметка:

|& является сокращением для 2>&1 | и недоступно в bash 3.x, который поставляется с macOS (для этого требуется bash> = 4). Его цель - перенаправить стандартный вывод и стандартную ошибку на ввод следующей команды после конвейера.

0
Yoric 20 Янв 2019 в 11:41

В macOS dtruss можно использовать так же, как strace в Linux:

$ sudo dtruss -t open -n bash

Есть некоторые различия в выводе, хотя он, вероятно, будет больше всего похож на ваш вопрос.

 PID/THRD         SYSCALL(args)                                      = return
 9658/0x130527a:  open("/dev/tty\0", 0x6, 0xFFFFFFFF8ED3D6B8)        = 3 0
 9658/0x130527a:  open("script.sh\0", 0x0, 0x0)                      = 3 0
 ...

Дополнительные аргументы SYSCALL для "открытия" включают open_nocancel и open_extended.

dtruss -h предоставит вам полный набор параметров.

Инструменты Dtrace: Брендан Грегг

0
l'L'l 20 Янв 2019 в 22:03