Befehls-Zeichenkette, die eine Pipe enthält, ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Sigi44

Befehls-Zeichenkette, die eine Pipe enthält, ausführen

Beitrag von Sigi44 » 15.04.2005 12:07:09

Folgendes Skript funktioniert nicht wie beabsichtigt:

Code: Alles auswählen

#!/bin/sh

BEFEHL="cat /etc/fstab | grep reiser"

echo Führe aus: $BEFEHL

$BEFEHL
Ergebnis: Inhalt der ganzen /etc/fstab und:
cat: |: Datei oder Verzeichnis nicht gefunden
cat: grep: Datei oder Verzeichnis nicht gefunden
cat: reiser: Datei oder Verzeichnis nicht gefunden

Code: Alles auswählen

BEFEHL="cat /etc/fstab \| grep reiser"
hilft auch nicht. Wer weiß die Lösung?
Ich möchte die String-Methode anwenden, um Befehle flexibel zusammenbauen/protokollieren zu können.

Danke schon im Voraus.

Benutzeravatar
Snoopy
Beiträge: 4296
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 15.04.2005 12:18:29

hi

versuche mal deine variable mit backticks zu versehen bsp

Code: Alles auswählen

#!/bin/sh

BEFEHL=`cat /etc/fstab | grep -i ext3`

echo ""
echo "Führe aus:"
echo "<cat /etc/fstab>"
echo ""
echo "$BEFEHL"

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Re: Befehls-Zeichenkette, die eine Pipe enthält, ausführen

Beitrag von fuzzy » 15.04.2005 12:38:13

Hallo Sigi44,
Sigi44 hat geschrieben: cat /etc/fstab | grep reiser
der "cat" Befehl geht, gilt aber als "unelegant"
http://www.linuxserverforum.de/vb/showt ... 2#post1152

lieber:

Code: Alles auswählen

grep -i reiser /etc/fstab
Gruß fuzzy

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 12:42:37

Müsste mit

Code: Alles auswählen

eval $BEFEHL
gehen

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 15.04.2005 12:54:22

Joghurt hat geschrieben:Müsste mit

Code: Alles auswählen

eval $BEFEHL
gehen
wenn dann

Code: Alles auswählen

eval echo $BEFEHL

@ fuzzy
Hallo Sigi44,
Sigi44 hat folgendes geschrieben:

cat /etc/fstab | grep reiser

der "cat" Befehl geht, gilt aber als "unelegant"
:lol:
naja :wink:
Zuletzt geändert von meandtheshell am 15.04.2005 18:21:54, insgesamt 1-mal geändert.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 13:14:24

meandtheshell hat geschrieben:
Joghurt hat geschrieben:Müsste mit

Code: Alles auswählen

eval $BEFEHL
gehen
wenn dann

Code: Alles auswählen

eval echo $BEFEHL
Begründung? eval $BEFEHL geht nämlich.

Code: Alles auswählen

BEFEHL=`cat /etc/fstab | grep something`
ist ok
Macht aber nicht das, was er wollte. Befehl enthält danach die Ausgabe von cat|.... er will aber sowas wie "set -x" emulieren.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 15.04.2005 13:19:51

nat. geht eval $befehl - nur eben hast du dann den wert der in der variable befehl gespeichert ist. bei eval echo $befehl evaluierst du zweimal d.h. die ganze zeile müsste mit eval noch einmal bearbeitet werden damit auch nicht das ergebnis von cat bei echo $befehl geliefert wird sondern das was grep findet

edit: ACHTUNG die zeilen darüber in dem posting sind schmarrn - habe noch einmal nachgesehen - habe was verwechselt - unten ein beispiel mit zahlen wo dem. wird was ich gemeint habe
Zuletzt geändert von meandtheshell am 15.04.2005 18:16:41, insgesamt 1-mal geändert.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 17:17:23

meandtheshell hat geschrieben:nat. geht eval $befehl - nur eben hast du dann den wert der in der variable befehl gespeichert ist. bei eval echo $befehl evaluierst du zweimal d.h. die ganze zeile müsste mit eval noch einmal bearbeitet werden damit auch nicht das ergebnis von cat bei echo $befehl geliefert wird sondern das was grep findet
Ach so?

Code: Alles auswählen

$ ls
aa ab bc
$ echo $A
ls | grep a
$ eval echo $A
$ eval $A
aa
ab

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 15.04.2005 17:41:55

@ Joghurt

zweck des codes von oben? was meinst du damit?

Benutzeravatar
se8i
Beiträge: 1017
Registriert: 08.11.2002 17:02:20
Wohnort: nähe Karlsruhe
Kontaktdaten:

Beitrag von se8i » 15.04.2005 17:59:03

Code: Alles auswählen

foo=ls
eval echo $foo
dann wird "echo $foo" ausgeführt, macht also das gleiche wie "echo $foo"

Code: Alles auswählen

foo=ls
eval foo
führt ls aus[/code]
Jazz is not dead, it just smells funny.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 18:00:16

meandtheshell hat geschrieben:zweck des codes von oben? was meinst du damit?
Wollte damit demonstrieren, dass das, was du geschrieben hast falsch ist, dass es "eval $BEFEHL" und nicht "eval echo $BEFEHL" heißen muss.

Nichts für ungut!

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 15.04.2005 18:09:02

Code: Alles auswählen

b=10
a=$b

Code: Alles auswählen

echo $a
$b
aber

Code: Alles auswählen

eval echo $a
10
das geht bei zahlen - d.h. kommandofolgen die eine zahl/oder sonst was als ergebnis haben können nicht so behandelt werden - das habe ich gemeint :oops:

Sigi44

Beitrag von Sigi44 » 16.04.2005 22:05:47

Besten Dank, "Joghurt",

Code: Alles auswählen

eval $BEFEHL
löst mein o.g. Problem.

Antworten