On 2008.10.01 at 17:57:01 +0300, Aleksey Cheusov wrote: > >> любом скриптовом языке. Ни в tcl ни в perl разыменование переменной не > >> смотрит, пуста строка, или нет. И проблема, как следствие та же. > > > Вопрос не в том, пуста строка или нет, а в том, будет ли она передана > > в выполняемую внешнюю команду как один параметр, или как произвольный > > набор таковых. > В целом я понимаю проблему, но в частностях - не вижу никакой разницы. > > > 0 ~>cat ~/tmp/1.perl > $str = "echo trtrtr; echo brbrbr"; > system("$str");
Я сказал СПИСКОВУЮ форму system. Если там один параметр то оно вызывает shell и приехали. Рассмотрим более реалистичный пример. Допустим, мы ожидаем в строке имя файла и хотим его посмотреть. Для определенности display. Злобный хакер подсовывает нам вместо имени файла кострукцию "coolchildporn.jpg; rm -rf /". Нет, это слишком жестоко. Пусть будет "innocentpic.jpg; echo "Ha-Ha, you are hacked!" Сравните результаты $filename='innocentpic.jpg; echo "Ha-Ha, you are hacked!'; system display, $filename; и system "display $filename"; В первом случае получаем display: unable to open file `innocentpic.jpg; echo "Ha-Ha, you are hacked!"': No such file or directory. Во втором "Ha-Ha, you are hacked!" на stdout. > P.S. До сих пор помню стоны товарищей, которые по работе писали на > tcl "В этом ^%$^* языке" пустые строки пропадают". Это насчет передачи Ну, Quoting hell в Tcl - это проблема известная. Лечится одним единственным путем. Заменой кодера на заведомо исправного. Который перед тем как начать писать на этом языке, читает man Tcl и осознает, что интерпретатор сделает ему ровно то, что там написано, и не более того. Да, конечно, большая часть кодеров документацию не читают, а если читают, то не пытаются понять и осознать, а смотрят только в примеры, которые подгибают под свой случай напильником. В Tcl это, увы, не работает. Там надо соблюдать три (ну в 8.5 четыре) математически строгих правила. -- -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]