bash stdin redirect

Hallo, kann mir jemand ganz schnell helfen?

Ich habe ein Programm, das interaktiv nach einigen Nummern fraegt.
Um es in einem Skript zu tun, moechte ich es in der Art machen:

program < input.txt

Aber ohne Datei.
D.h. ich wuerde gerne:

program < "2 34 5 6y 6"

machen, moeglicherweisse auch mit newlines.

Ich erinnere mich nicht, wie das genannt wird und wonach in google zu
suchen.

Help :slight_smile:

Danke
Andrea

Habs wieder gefunden!
"here document" heisst es...

program <<somedelimiter
8 10 9
somedelimiter

Ciao
Andrea

* [A.D. 19/12/06 17:47], Andrea Antonello <andrea.antonello(a)gmail.com> probably wrote:

Andrea Antonello wrote:

D.h. ich wuerde gerne:
program < "2 34 5 6y 6"

echo 1 2 3 4 5 | program

machen, moeglicherweisse auch mit newlines.

cat <<EOF | program
1
2
3
4
EOF

Ich erinnere mich nicht, wie das genannt wird und wonach in google zu
suchen.

Pipe, input redirection etc.

Wenn du inkompatibel programmieren willst, kannst du auch <((...))
verwenden. Das schreibt den Output von "..." in einen temporaeren
Filedescriptor und uebergibt den Filenamen des descrptors (in /proc) an
das Programm als parameter. Ich weiss nich ob das auf einem anderen OS als
Linux funktioniert, aber es ist interessant zu wissen.

z.B.:

thomas(a)www:~$ cat <((echo x; sleep 10; echo y)) &
[1] 8101
thomas(a)www:~$ ps auxw
[...]
thomas 8101 0.0 0.2 1576 364 pts/0 S 12:00 0:00 cat
/dev/fd/63
[...]

Super, dann habe ich gleich eine neue Frage...

Ich habe Serien von Numern, die auf einer Linee eingegeben werden
muessen, koennte z.B. sein:
n1="8 10 9"
n2="11 13 12"
n3="15 20 30"

Andrea Antonello wrote:

Ich habe Serien von Numern, die auf einer Linee eingegeben werden
muessen, koennte z.B. sein:
n1="8 10 9"
n2="11 13 12"
n3="15 20 30"

Ohje. Arrays in der schell sind die Hoelle. In der manpage zu Bash sind
arrays a' la xxx[12]="lala" beschrieben, aber so wie du die Daten hast,
hilft dir das wenig.

i=1
n1="8 10 9"
echo `eval echo \\$n$i`

eval macht nicht anderes als den Ausdruck den eval als Parameter erhaelt,
noch einmal nach den Regeln der Shell zu interpretieren (evaluieren) und
auszufuehren.

1) Du gibst "echo `eval echo \\$n$i`" ein.
2) Die Shell interpretiert alle back-slashes; der eigentliche Ausdruck ist
dann: "echo `eval echo \$n$i`"
3) eval sieht als parameter die strings "echo" "\$n$i"
4) evaluiert diese zu "echo" "$n1"
5) und fuehrt den befehl dann aus. Das Ergebnis ist "8 10 9"
6) Das allererste echo schreibt den String dann auf den Bildschirm.

Wenn du alle strings in einer Schleife ausgeben willst:
i=1
while [ -n "`eval echo \\$n$i`" ]; do
        echo `eval echo \\$n$i`
        i=`expr $i + 1`
done

Die Schleife stoppt dann bei der ersten Variable n$x, welche nicht gesetzt
ist.

Wenn du das alles an ein Programm fuettern willst:
i=1
while ...
...
done | program

und wenn du leerzeichen ersetzt haben willst, dann:
...
done | sed -e 's/ */\n/g' | prigram

das funktioniert nur mit neueren Sed; bei aelteren Sed musst du das \n
durch ^V (CTRL-V) ersetzen.

Du siehst es wird zunehmend grausliger, je besser du es machen willst. Ein
alternativer Vorschlag waere, "set" zu verwenden. (ungetestet)
i=1
set ""
while [ -n "`eval echo \\$n$i`" ]; do
    set $* `eval echo \\$n$i`
    i=`expr $i + 1`
done

for i in $*; do
    echo $i
done | program

HTH,
Thomas

Ich habe ein Programm, das interaktiv nach einigen Nummern fraegt.
Um es in einem Skript zu tun, moechte ich es in der Art machen:

program < input.txt

Aber ohne Datei.
D.h. ich wuerde gerne:

program < "2 34 5 6y 6"

machen, moeglicherweisse auch mit newlines.

printf "2 34 5 6y 6" | program
oder
printf "2\n34\n5\n6y\n6" | program

je nachdem ob program die Newlines braucht oder Spaces...

Ich erinnere mich nicht, wie das genannt wird und wonach in google zu
suchen.

Das waere dann eine "pipe"...

Bye, Chris.

Habs wieder gefunden!
"here document" heisst es...

program <<somedelimiter
8 10 9
somedelimiter

Ach, das meintest Du!
Das ist praktisch wenn's laenger ist.. :slight_smile:

Bye, Chris.