Можно получить большую информацию о программе путем вызова его под strace
. Это показывает каждый системный вызов, что программа делает, который может иногда быть слишком большой информацией, но может быть большой справкой для нахождения то, что идет не так, как надо.
Приблизьтесь нужно запустить Ваше большое приложение под strace
. Это, вероятно, произведет большой вывод и замедлит Ваше приложение.
strace -s9999 -efile,process -f -o bigapp.strace bigapp
Если большое приложение является интерактивным, можно предпочесть запускать его и подключать strace к нему, после того как Вы готовы инициировать вычисления. Отметьте идентификатор процесса приложения, скажите 12345 и работайте
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
Если достаточно заметить, что внешний исполняемый файл, то как другое ответы уже предложили, заменяет тот исполняемый файл сценарием обертки. Можно переместить исполняемый файл в другое имя и положить сценарий обертки на его место или поместить сценарий обертки перед обычным исполняемым файлом в PATH
, или настройте приложение для вызова сценария обертки вместо обычного исполняемого файла, независимо от того, что удобно. Сделайте тот сценарий обертки
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"
Объяснение strace параметров использовало:
-e
выбирает системные вызовы трассировки. Можно указать системные вызовы по имени или использовать несколько категорий такой как file
(open
, close
, read
, write
, …) и process
(fork
, execve
, …).-f
делает strace, следует за ветвлениями, т.е. подпроцессами трассировки, а также исходным процессом.-o
выбирает название файла, содержащего трассировку. $$
конструкция оболочки, которая обозначает идентификатор процесса процесса оболочки (из-за использования exec
в последнем сценарии обертки, который также будет идентификатором процесса дополнительного приложения).-s9999
заставляет его отобразить это много байтов для read
и write
и другие вызовы.Это был бы ад для сообщения find
что сделать в этом случае.
Лучше используйте оболочку:
for i in **/*.{xrt,ini,moo}; do
FILE=$(basename "$i")
DIR=~/dst/${FILE%.*}
echo mkdir -p -- "$DIR"
echo mv -i -t "$DIR" -- "$i"
done
Использовать shopt -s globstar
сделать **
работа шарика (или использование zsh!). И удалите echo
s позже, если команда печатает то, что Вы хотите.
обман находит командную строку:
find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;
на самом деле работа вокруг для призыва сценария удара находит LOL.
=P
happy rm -rf /
! Этот вид кода заслуживает-1.
– Stéphane Gimenez
07.02.2012, 15:04
Yay" rm -rf / "Rox0r.avi
, снова там похож на проблему …
– Stéphane Gimenez
07.02.2012, 15:22
-exec bash -c 'command which uses "$1"' bash '{}' ';'
. Ну, это довольно бессмысленно так или иначе. сделанный
– Stéphane Gimenez
07.02.2012, 15:26
shopt -s globstar
, посмотрите мое редактирование. Если существует только два уровня, можно использовать*/*.*
и отрывок будет работать в любой оболочке. – Gilles 'SO- stop being evil' 07.02.2012, 02:40