Schrift
[thread]6062[/thread]

system(...) funktion

Leser: 3


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Math55
 2004-02-08 11:54
#79935 #79935
User since
2003-08-19
44 Artikel
BenutzerIn
[default_avatar]
hallo, ich mache aus perl einen systemaufruf mit:

Code:

system("tar -cf $filename @files");




wobei $filename ein dateiname ist, also zum beispiel hallo.tar und in dem array @files stehen die dateien, die getart werden sollen. mein problem ist allerdings, das es ja auch dateien mit leerzeichen geben kann, also sowas .


this is a test.log

allerdings klappt dann tar nicht. jetzt kann ich aber auch nicht quoten (system("tar -cf $filename '@files'")), da er so nicht jede datei aus dem array quotet, sodnern alle, also nicht

tar -cf $filename 'file1' 'file2' sondern tar -cf $filename 'file1 file2'. da spielt tar wieder nicht mit. jemand ne lösung?

DANKE:-)\n\n

<!--EDIT|Math55|1076234164-->
Ronnie
 2004-02-08 12:05
#79936 #79936
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Jetzt mal ungetestet:
Code: (dl )
foreach $file (@files) { $file =~ s/^(.*)$/'$1'/; }

So kannst du vor dem system-Aufruf alle $file in @files quoten.
jan
 2004-02-08 12:32
#79937 #79937
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
oder noch ein wenig einfacher:

map {$_ = "'" . $_ . "'";} @files;
Math55
 2004-02-08 12:44
#79938 #79938
User since
2003-08-19
44 Artikel
BenutzerIn
[default_avatar]
hi, danke :-)

danach kann ich dann den system aufruf machen wie gehabt?

DANKE!!
jan
 2004-02-08 13:12
#79939 #79939
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, an sich schon.
du kannst aber auch, das ist vielleicht einfacher, die parameter für tar auch als parameter an system übergeben
Code: (dl )
system("tar -cf", $filename, @files); 

ist nicht getestet, sollte aber funktionieren - auch ohne gequotete elemente in @files.
Ronnie
 2004-02-08 13:36
#79940 #79940
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=jan,08.02.2004, 11:32]oder noch ein wenig einfacher:

map {$_ = "'" . $_ . "'";} @files;[/quote]
auch wenn ich damit evtl. eine alte Diskussion wieder anrühre, aber du verwendest map im void Kontext, oder? Sinnvoller ist immer eine Zuweisung, also:
Code: (dl )
@files = map {$_ = "'" . $_ . "'";} @files;

Habe es aber mal ausprobiert und es geht beides:
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

my @files = qw( file1 file2 file3 );
map {$_ = "'" . $_ . "'";} @files;
print @files, "\n";

Ich erinnere mich aber düster, das die Verwendung von map ohne eine Zuweisung nicht immer von Erfolg gekrönt ist.
jan
 2004-02-08 13:58
#79941 #79941
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, da $_ ein alias auf das element ist, kann man es darüber direkt verändern und sich die zuweisung sparen.
mit zuweisung geht es natürlich genausogut und ist auch leserlicher, da das verhalten von map in dem kontext wahrscheinlich nicht jedem bekannt ist, wie das beim benchmarking aussieht, da bin ich unsicher und zu faul, es auszuprobieren. welche form von problemen könnten da auftreten?
Dubu
 2004-02-08 18:51
#79942 #79942
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=jan,08.02.2004, 12:12]du kannst aber auch, das ist vielleicht einfacher, die parameter für tar auch als parameter an system übergeben
Code: (dl )
system("tar -cf", $filename, @files); 

ist nicht getestet, sollte aber funktionieren - auch ohne gequotete elemente in @files.[/quote]
"-cf" gehoert aber nicht zum Programmnamen sondern ist der erste Uebergabeparameter:
Code: (dl )
system('tar', '-cf', $filename, @files); 

So spart man sich das unsichere Gequote. Sowieso: Was ist denn, wenn ein Dateiname ein Single Quote enthaelt? Das kommt z.B. bei meinen MP3s recht haeufig vor. :)
jan
 2004-02-08 20:37
#79943 #79943
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, -cf sollte auch als param kommen.
Strat
 2004-02-08 23:59
#79944 #79944
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ein systemaufruf ohne fehlerabfrage, und keiner meckert rum....
Code: (dl )
1
2
3
if (system($command, @args)) {
die ""Error: executing $command @args failed: $?\n";
}


btw: ich verwende recht gerne
tar cvf package.tar ....
oder mit komprimierung
tar cvzf package.tar.gz ...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-02-08 11:54.