Удостоверьтесь, что Вы имеете
Include conf/extra/httpd-userdir.conf
и
LoadModule userdir_module modules/mod_userdir.so
в Вашем httpd.conf.
awk
может получить доступ к переменным среды с помощью ENVIRON
специальный массив. Однако, в то время как можно присвоить значения элементам того массива, он не передается в среде команд, выполняемых awk
system
, | getline
или print |
. Это ENVIRON
массив только предназначается для awk
для получения значения переменных среды, это передается.
Можно сделать: system("ls " var)
, но остерегайтесь этого строка, которая передается awk
system()
(или print |
или | getline
) на самом деле передается как аргумент sh -c
, таким образом, это интерпретируется как код оболочки.
Например, если awk
var
переменная содержит foo;rm -rf /
, это не скажет ls
перечислять названный файл "foo;rm -rf /"
но вместо этого перечислять названный файл foo
и затем rm
команда будет выполнена.
Так, Вы, возможно, должны выйти из всех символов, особенных для оболочки в этом var
переменная.
Это могло быть сделано, например, с:
awk '
function escape(s) {
gsub(/'\''/, "&\\\\&&", s)
return "'\''" s "'\''"
}
{
cmd = "date -d " escape($0) " +%s"
cmd | getline seconds
close(cmd)
print seconds
}'
В то время как это означает выполнять одну оболочку и один date
управляйте на строку, Вы могли бы также сделать чтение файла с самой оболочкой:
while IFS= read <&3 -r line; do
date -d "$line" +%s
done 3< the-file
Если вы передаете переменную Awk в систему , вам нужно процитировать ее в оболочке:
function quote(str, d, m, x, y, z) {
d = "\47"; m = split(str, x, d)
for (y in x) z = z d x[y] d (y < m ? "\\" d : "")
return z
}
Пример:
system(sprintf("date -d %s +%%s", quote($0)))
'\''
(строка конца, вставить\'
, продолжите строку). В сценарии AWK (файл) достаточно использоватьgsub(/'/, "'\\''", s); return "'" s "'";
, но для команды "остроты", одинарных кавычек и обратных косых черт должен оставить снова как показано Stephane. – Lekensteyn 22.11.2013, 23:46