2014-02-12 5 views
0

Привет всем Я хочу, чтобы знать, может ли wget вернуть true или false (0 или 1) только после обработки определенного URL-адреса. Моя идея - создать небольшой скрипт PERL для мониторинга нескольких моих веб-страниц и отправки электронной почты или какого-то предупреждения (я все еще в процессе dev). Вот то, что я до сих пор:Может ли Wget вернуть true или false (0 или 1)

#!usr/bin/perl 
use strict; 
use warnings; 
#use LWP::Simple; 

my $url='google.com'; 

system('wget --delete -q $url'); 
print "$?"; 
if($? != 0) 
{ 
     print "false\n"; 
} 

else 
{ 
     print "OK\n"; 
} 

Это только начало, но я пытаюсь сделать это тихо, как это возможно, меньший выход, тем лучше. Это мой вывод сейчас: Попробуйте `wget --help 'для получения дополнительных опций. false Любая помощь будет оценена по достоинству. Также это не должно быть wget, но это то, что я знаю до сих пор.

+0

Какую версию wget вы используете? Я не вижу в моей опции «-delete». – squiguy

+0

Я использую один в UNIX и Ubuntu, у них есть опция -delete, которая предотвращает сохранение файлов в каталоге. Как узнать wget ver. Я понятия не имею – user3287340

ответ

2

$url не интерполированное в одном кавычках буквальном, так что вы запустили команду оболочки

wget --delete -q $url 

Если нет переменной окружения url, это выполняет команду wget с двумя параметрами --delete и -q. Wget жалуется на «Отсутствующий URL» (вы пропустили некоторые строки ошибок) и возвращает код состояния 1.

Переменная $? содержит код состояния команды, умноженный на 256. Точнее, это возвращаемое значение по wait system call. Имея $?, равный нулю, указывает на успех, вы получили эту часть права. Отказ может быть кодом, отличным от 1: любое ненулевое значение указывает на сбой.

Если вы хотите, чтобы увидеть абсолютно никакого выхода никогда, перенаправлять вывод и ошибки в /dev/null:

system("wget --delete -q $url >/dev/null 2>/dev/null"); 

Но это плохая идея, чтобы скрыть ошибки: если вы сделаете это, вы не можете диагностировать их , Вы можете стереть нормальный выход, не скрывая ошибок, только перенаправляя stdout. Но опция wget -q делает это уже.

system("wget --delete -q $url"); 
if ($?) { 
    print "false\n"; 
} else { 
    print "OK\n"; 
} 

Этот код предполагает, что $url не содержит специального символа оболочки. Если вы не можете гарантировать, что, защитить все оболочки специальные символы:

system('wget --delete -q ' . quotemeta($url) . ' >/dev/null 2>/dev/null'); 

или, если вы не игнорируя сообщения об ошибках, пропустить оболочку в целом с помощью нескольких аргументов формы в о system:

system('wget', '--delete', '-q ', $url); 
+1

'quotemeta' - не самый подходящий инструмент для работы. Он не будет правильно обрабатывать все символы. 'system (" ... '$ url'); 'достаточно хорош для URL-адресов, но если вы хотите использовать общее решение, это' use String :: ShellQuote qw (shell_quote); system (shell_quote ('wget', '- -delete ',' -q ', $ url)). 'Конечно, вы можете избежать необходимости в модуле, полностью избегая оболочки:' system (' wget ',' --delete ',' -q ' , $ url); ' – ikegami

+0

@ikegami Какой символ не обрабатывается' quotemeta' правильно (кроме новой строки)? Вы правы в форме списка - я собирался использовать его, а затем хотел что-то простое, которое работало с перенаправлением , затем переместил вещи, чтобы упоминать только катметуту в примере без перенаправления и забыл упомянуть о форме списка - я добавляю ее обратно. – Gilles

+0

Newline - это символ. Прежде чем вы скажете, что никогда не найдете этого в URL-адресе, позвольте мне повторить, что вы могли бы использовать '' '$ url' '', а не quotemeta, если вы ищете решение, специфичное для URL-адресов (так как URL-адреса не могут иметь один -кавычки). – ikegami

Смежные вопросы