Schrift
[thread]6994[/thread]

Startscript: Kleines Problem mit meinen Ideen ein Tea

Leser: 1


<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten
Gast Gast
 2005-05-15 07:04
#54932 #54932
HI,


(wenn mich jemand darauf Hinweist das ich den Beitrag schon unter perl.de ge schreiben hab ... ja ich hab es blos bekomme ich da blos in moment keine Antwort und ich suche seit STUNDEN nen Lösungsweg und finde einfach keinen ... um 19:26Uhr hab ich angefangen um 19:29Uhr hab ich das erste Problem jetzt is es 4:56Uhr und ich find einfach keine Lösung ... PLZ HELP |-(
http://forum.perl.de/bb/ftopic3134.html



.........



Weis jemand wo da der Fehler liegt?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!usr/bin/perl 

print "Waehlen sie aus was sie möchten? \n (1) TeamSpeak2 Server Starten oder Rebooten \n (2) TeamSpeak2 Server Stoppen \n (3) Server Reboot \n";
print "Eingabe: ";
print $b1=<>;
chop ($b1);

$Givenvergleich = $b1;
given $Givenvergleich
{
when '1' {print `cd ../home/TS/` + `./teamspeak2-server_startscript stop` + `./teamspeak2-server_startscript start`;}
when '2' {print `cd ../home/TS/` + `./teamspeak2-server_startscript stop`;}
when '3' {print `reboot`;}
}



Given soll erst ab Perl 6 Funtzen ... Geht's denn schon?

Ähm ...

Noch ne Frage ... ick werkel immer noch daran rum ... und zwar

...

Code: (dl )
print `cd ../home/TS/` + `./teamspeak2-server_startscript stop` + `./teamspeak2-server_startscript start`; 



egal wie ich kann keine BEFEHLSKETTEN ausführen lassen ...
es kommt immer die Fehlermeldung:
-bash ... COMMAND NOT FOUND ...

wenn ich aber `reboot` als einzigen Befehl ausführenlassen will, geht das ... blos nicht in Verbindung mit z.b. ein Verzeichniss wie beim Befehl cd ...


......



Ich möchte für'n Kumpel der sich mit Linux überhaupt nicht auskennt, nen Kleines Script er stellen womit er einige Programme Starten / Beenden kann ... u.a. Teamspeak, Counterstrike usw... damit nicht immer ich alles von a-z selber machen muss.

Wenn ich print"BEFEHL"; eingebe, macht er nichts, ausser den Inhalt wiederzugeben ... ok das ist gut so ...
aber wenn ich print `BEFEHL DATEINAME` eingebe führt er höhstens den Befehl aus.

Also ich blick da nicht mehr durch ... in meinen Perl Buch steht leider nur SEEEEHR WENIG drinne und im Netzt find ich solche Probleme wie ich sie habe , nürgends!

Wäre Hammer nett wenn jemand ne Lösung hätte.

ne Runde Code-Tags spendiert...\n\n

<!--EDIT|Crian|1116334799-->
Ronnie
 2005-05-15 11:27
#54933 #54933
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
given kommt erst mit Perl6, im CPAN finden sich allerdings Alternativen für Perl5. Bei nur drei Auswahl-Möglichkeiten kannst du bequem mit if, elsif und else arbeiten. Du solltest am Anfang deines Skriptes use strict; und use warnings; stehen haben um auf Fehler in deinem Skript hingewiesen zu werden.

Beispiel wie der if, elsif, else aussehen könnte (ungetestet):
Code: (dl )
1
2
3
4
if ($eingabe eq '1') {chdir '/path/script'; print qx'./teamspeak2-server_startscript start';}
elsif ($eingabe eq '2') {chdir '/path/script'; print qx'./teamspeak2-server_startscript stop';}
elsif ($eingabe eq '3') {print qx'reboot'; exit;}
else die "Falche eingabe";
BoSSSpy
 2005-05-15 12:56
#54934 #54934
User since
2005-05-15
11 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke ... was macht eigentlich dieses ' print qx ' ... und müssen Befhle nicht in `` Stehen statt als im '' ?
Bei Fragen, fragen.
renee
 2005-05-15 13:10
#54935 #54935
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
qx ersetzt ``

Aus perldoc perlop:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
qx/STRING/
`STRING`

A string which is (possibly) interpolated and then executed as a system command with /bin/sh or its equivalent. Shell wildcards, pipes, and redirections will be honored. The collected standard output of the command is returned; standard error is unaffected. In scalar context, it comes back as a single (potentially multi-line) string, or undef if the command failed. In list context, returns a list of lines (however you've defined lines with $/ or $INPUT_RECORD_SEPARATOR), or an empty list if the command failed.

Because backticks do not affect standard error, use shell file descriptor syntax (assuming the shell supports this) if you care to address this. To capture a command's STDERR and STDOUT together:

$output = `cmd 2>&1`;

To capture a command's STDOUT but discard its STDERR:

$output = `cmd 2>/dev/null`;

To capture a command's STDERR but discard its STDOUT (ordering is important here):

$output = `cmd 2>&1 1>/dev/null`;

To exchange a command's STDOUT and STDERR in order to capture the STDERR but leave its STDOUT to come out the old STDERR:

$output = `cmd 3>&1 1>&2 2>&3 3>&-`;

To read both a command's STDOUT and its STDERR separately, it's easiest and safest to redirect them separately to files, and then read from those files when the program is done:

system("program args 1>/tmp/program.stdout 2>/tmp/program.stderr");

Using single-quote as a delimiter protects the command from Perl's double-quote interpolation, passing it on to the shell instead:

$perl_info = qx(ps $$); # that's Perl's $$
$shell_info = qx'ps $$'; # that's the new shell's $$

How that string gets evaluated is entirely subject to the command interpreter on your system. On most platforms, you will have to protect shell metacharacters if you want them treated literally. This is in practice difficult to do, as it's unclear how to escape which characters. See perlsec for a clean and safe example of a manual fork() and exec() to emulate backticks safely.

On some platforms (notably DOS-like ones), the shell may not be capable of dealing with multiline commands, so putting newlines in the string may not get you what you want. You may be able to evaluate multiple commands in a single line by separating them with the command separator character, if your shell supports that (e.g.; on many Unix shells; & on the Windows NT cmd shell).

Beginning with v5.6.0, Perl will attempt to flush all files opened for output before starting the child process, but this may not be supported on some platforms (see perlport). To be safe, you may need to set $| ($AUTOFLUSH in English) or call the autoflush() method of IO::Handle on any open handles.

Beware that some command shells may place restrictions on the length of the command line. You must ensure your strings don't exceed this limit after any necessary interpolations. See the platform-specific release notes for more details about your particular environment.

Using this operator can lead to programs that are difficult to port, because the shell commands called vary between systems, and may in fact not be present at all. As one example, the type command under the POSIX shell is very different from the type command under DOS. That doesn't mean you should go out of your way to avoid backticks when they're the right way to get something done. Perl was made to be a glue language, and one of the things it glues together is commands. Just understand what you're getting yourself into.

See "I/O Operators" for more discussion.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2005-05-15 13:13
#54936 #54936
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=BoSSSpy,15.05.2005, 10:56]Danke ... was macht eigentlich dieses ' print qx ' ... und müssen Befhle nicht in `` Stehen statt als im '' ?[/quote]
Nein, wenn man qx verwendet kann man die Begrenzungszeichen (z.b. '.",#,(), etc.) frei wählen, die ``-Backticks verhalten im Endergebnis aber ziemlich gleich.

Genaueres kannst du hier bei qx nachlesen: http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
BoSSSpy
 2005-05-15 13:25
#54937 #54937
User since
2005-05-15
11 Artikel
BenutzerIn
[Homepage] [default_avatar]
hmmm ah ah ...

Ok das muss ich mir noch mal GANZ langsam durch lesen (Eng. is nicht meine Stärke).
Aber danke schon ma ...

Sag ma einer ....

wenn ich im {chdir '/path/script'; print qx'./teamspeak2-server_startscript start';} bereich jetzt Variablen einfüge ... geht das?
z.b. :
$Tss=" start";
$Tsp=" stop";
{chdir '/path/script'; print qx'./teamspeak2-server_startscript $Tss';}
würde das ohne weiteres gehn?

Und kann ich in einer If abfrage einfach eine eingabe bestätigung verlangen?
also:

Wenn man Nr.1 Wählt dann kommt die Frage:
Wollen sie den Server
(1)Starten oder
(2)Stoppen oder wollen sie
(3)zurück
Eingabe:

und in einer IF-Abfragung noch mal If, else ... Anwenden? Also eine If/else verschachtelung.
Bei Fragen, fragen.
renee
 2005-05-15 13:27
#54938 #54938
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
2 x Ja
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
BoSSSpy
 2005-05-15 13:41
#54939 #54939
User since
2005-05-15
11 Artikel
BenutzerIn
[Homepage] [default_avatar]
jor ... denn hätt ich nur noch (warscheinlich später doch noch...) eine Frage und zwar ...


Jedes mal wenn ein befehl abgesendet worden ist ... steht bei mir in Putty danach NICHTS mehr ... ich muss Putty schließen und mich neu Einloggen ... wenn ich eine Falsche eingabe betätigt hab passiert nichts (ausser das meine Eingabe 2x wieder gegeben wird und ich in der darauffolgenden Zeile ich ne neue Chance zur eingabe bekomme). Ich kann das Programm dann neu starten und mein Versuch wiederholen.

Ach ja und wie mach ich das das ich ZURÜCK geh kann ... also z.b. beim Beispiel darüber was ich nannte, das man zum Anfangs Menü geleitet wird wenn man wahl (3) Zurück gewählt hat.
Irgend wie sol das mit " GOTO " Funtzen. Im Buch steht aber nur "goto Ziel" ... und wird nur aufgeliestet das es diesen Befehl gibt ... weiter steht da nichts.
Bei Fragen, fragen.
BoSSSpy
 2005-05-15 15:21
#54940 #54940
User since
2005-05-15
11 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok das mit "goto" war einfach zuverstehn ...
(für alle die auf "SUCHEN" in diesen Forum und "got"o als Suchbegriff eingegeben haben)

goto is nichts anderes als ein Anker (wie bei HTML) der also ab diesen Punkt wo er den befehl "goto" bekommt zu der Makierten stellen zu springen. Dies wird er immer und immer wieder tun wenn man ihn nicht beschränkt ... also z.b. mit einer if-Bedingung wo der User wat eingeben muss.

CODECODECODE

WEGPUNKT: ##Hier wird der Anker gesetzt und hier wird das Programm wiederzurück springen, wenn nun der "goto" befehl kommt.

CODECODECODE
CODECODECODE
CODECODECODE
CODECODECODE
CODECODECODE
CODECODECODE
goto WEGPUNKT; ##ab hier wird er wieder ganz zurück (zu "WEGPUNKT:") und wird wieder von anfangan anfangen ... der "WEGPUNKT:" kann (fast) überall eingeschoben werden...
goto sollte meiner Meinung nur bei Menü Punkten angewendet werden, wie z.b.
(1)mach dies
(2)mach das
(3)zurück ins Hauptmenü ##Hier goto einsetzen, sonnst lieber nicht, weil sonnst ne UNENTLICHKEITSSCHLEIFE ausgeführt wird (denk ich ma).



Was mein Problem an geht:

Das beim Ausführen meines Teamspeak's das Programm stehn bleibt und ich PuTTY neustarten muss ... da hab ich noch keine Lösung gefunden...
Bei Fragen, fragen.
Ronnie
 2005-05-15 17:25
#54941 #54941
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
GOTO sollte man nur verwenden wenn man wirklich gute Gründe dafür hat. Du solltetst besser while verwenden:

Code: (dl )
1
2
3
4
5
6
my $eingabe;
while ($eingabe ne 'exit') {
$eingabe = <STDIN>;
chmop($eingabe);
# if ($eingabe eq '1') { ...
}
<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten



View all threads created 2005-05-15 07:04.