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