backtick a stderr

Tom Mueller tom na cnb.cz
Pondělí Červenec 12 14:19:57 MEST 1999


Ahoj

Pouzivam Perl 5.004_04 v HP-UXu 11.0 a narazil jsem na takovou zahadu.
Sam ne a ne prijit na to, cim to je, a tak bych nekoho z vas rad pozadal
o radu.

Skript jsem orezal a pro zjednoduseni popisu meho problemu to vypada asi
takhle. Na vzdalenem serveru pres remsh si chci schovat crontab:

#!/usr/bin/perl -w
$date=`date +%Y%m%d`;	# <----
$c=`remsh v1t -n 'crontab -l >/tmp/crontab.$date 2>&1'`;
print "c='$c'\n";

Tedy chci aby to na serveru v1t udelalo crontab -l a vystup prikazu
crontab -l sel do souboru /tmp/crontab.19990712 (dneska) a v pripade,
ze nemam nic nacronovano, aby do tohodle souboru sel i stderr prikazu
crontab -l, tedy hlaska "crontab: can't open your crontab file."

No a ono to nejde. Presmerovani stderr-u, tedy to 2>&1, ktere ma byt
az na tom serveru v1t jaksi nezabere a hlaska mi vyplave na stderr toho
myho lokalniho perlu. A ted bacha! Pokud promennou $date neplnim takhle
ze zpetnych apostrofu, ale jako retezcovy literal, tak to jde:

#!/usr/bin/perl -w
$date='19990712';	# <----
$c=`remsh v1t -n 'crontab -l >/tmp/crontab.$date 2>&1'`;
print "c='$c'\n";

Tedy dopadne to spravne takhle (skript x v current adresari):

$ ./x
c=''
$

a na serveru v1t je v souboru /tmp/crontab.19990712 uvedene chybove hlaseni.

Kdezto prvni zahadny pripad dopadne takhle:

$ ./x
crontab: can't open your crontab file.
c=''
$

a na serveru v1t je soubor /tmp/crontab.19990712 vesele prazdny.

Vubec netusim, proc to naplneni promenne $date ovlivnuje presmerovani
stderr-u v dalsim prikazu, nebo spis dokonce vyhodnoceni "uzavorkovani"
normalnimi a obracenymi apostrofy v prikazu nekde za tim.

Budu velmi vdecny za jakoukoliv ideu nebo aspon zpravu, zda to nekomu
chodi stejne divne, jinak divne nebo spravne. Krasne a dlouhe leto...
-- 
Tom Mueller


Další informace o konferenci Perl