При написании скриптов DTrace, часто вам нужно передать скрипту какой-нибудь параметр в командной строке. Эта простая задача может быть неожиданно трудной, если не прочесть раздел
docs.sun.com про
написание скриптов на DTrace, особенно раздел про
макросы параметров командной строки.
Как и в оболочках
sh и
bash, вы можете получить значения параметров командной строки с помощью макросов
$0..
$9. Но тут есть одно "но". Значения параметров должны попадать под определенный тип - число, имя идентификатора или строку. Если переданный параметр не попадает под одно из этих определений, будет выдана ошибка.
Давайте начнём с простенького скрипта.
CODE:
#!/usr/sbin/dtrace -s
#pragma D option quiet
BEGIN {
printf("Your parameter: %d\n", $1);
}
Если передать этому скрипту число в качестве параметра, никакой ошибки не будет, и вы получити следующее сообщение:
Your parameter: 123
Но если попробовать передать строчку вместо числа, выйдет следующее:
bash-3.00# ./args.d a1b2c3
dtrace: failed to compile script ./args.d: line 9: failed to resolve a1b2c3: Unknown variable name
Это происходит потому, что DTrace пытается найти идентификатор "a1b2c3". Почему так происходит? Это из-за особенностей определения типа параметра. Значение не похоже на число, а из-за того, что мы передали строку без кавычек, DTrace считает, что это не строка. Единственный остающийся вариант - это идентификатор. Переменной с таким именем в скрипте нет, и потому мы получаем ошибку.
Чтобы проверить эту теорию, можно просто создать переменную с таким же именем в скрипте:
CODE:
#!/usr/sbin/dtrace -s
#pragma D option quiet
BEGIN {
a1b2c3=1979;
printf("Your parameter: %d\n", $1);
}
Пожалуйста - всё работает именно так, как я сказал:
Your parameter: 1979
И если параметр у вас - точно строчка, то нужно изменить скрипт (чтобы printf печатал строку %s, а не целое число %d, иначе и тут будет ошибка)...
CODE:
#!/usr/sbin/dtrace -s
#pragma D option quiet
BEGIN {
a1b2c3=1979;
printf("Your parameter: %s\n", $1);
}
... и передать строку, заключив её в кавычки, вот так:
bash-3.00# ./args.d '"a1b2c3"'
Your parameter: a1b2c3
Как вы видите, теперь мы действительно передаём и обрабатываем наш параметр как строку, а одноимённая переменная, специально оставленная в скрипте, больше не используется, иначе было бы выведено её значение.
Ну и ещё одна вещь напоследок. Если вы хотите все параметры обрабатывать как строки, и при этом не использовать кавычек, всё что нужно для этого, это работать с макросами с помощью двойного знака
$, и тогда вся процедура определения типа параметра будет пропущена:
CODE:
#!/usr/sbin/dtrace -s
#pragma D option quiet
BEGIN {
a1b2c3=1979;
printf("Your parameter: %s\n", $$1);
}
И вот как можно будет передавать строки такому скрипту:
bash-3.00# ./args.d a1b2c3
Your parameter: a1b2c3
Ну вот и всё на сегодня... Удачи с вашими скриптами DTrace!