Daten per PIPE an eigenes Script übergeben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
peddy
Beiträge: 65
Registriert: 22.08.2006 10:41:10

Daten per PIPE an eigenes Script übergeben

Beitrag von peddy » 28.02.2011 14:14:02

Hallo,

ich finde das Verketten von Befehlen über eine Pipe sehr praktisch und würde das auch gern für eigene Programme nutzen.

Code: Alles auswählen

ls -1 | meinscript.sh
Das Problem ist nur, dass mein Script die Daten nur optional über eine Pipe bekommen soll. Bei einem Aufruf von ./meinscript.sh soll es sich anders verhalten.

Der Code funktioniert leider nicht:

Code: Alles auswählen

#!/bin/bash
DATEN=`cat -`

if [ -z "$DATEN" ]; then
        echo "Keine Werte übergeben"
else
        echo $DATEN
fi
Wie kann ich das Problem lösen?

uname
Beiträge: 12421
Registriert: 03.06.2008 09:33:02

Re: Daten per PIPE an eigenes Script übergeben

Beitrag von uname » 28.02.2011 15:19:37

Eigentlich ist es ja nur STDIN

Perl:

Code: Alles auswählen

#! /usr/bin/perl                                                                                                                                      
while (<STDIN>)                                                                 
{                                                                               
  print $_;                                                                     
}  
Bash:

Code: Alles auswählen

#!/bin/bash
while read line;
do
echo $line
done

peddy
Beiträge: 65
Registriert: 22.08.2006 10:41:10

Re: Daten per PIPE an eigenes Script übergeben

Beitrag von peddy » 01.03.2011 13:24:48

Code: Alles auswählen

#!/bin/bash
while read line;
do
echo $line
done
Danke schon mal.

Das Script erwartet immer Daten aus der Pipe. Gibt es eine Möglichkeit, wie man das Script felxibler gestalten kann. Sprich, wenn keine Daten über die Pipe an das Script übergeben werden sollen die Hostnamen vom User erfragt werden.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Daten per PIPE an eigenes Script übergeben

Beitrag von newdeb » 03.03.2011 11:42:38

Test-Option -t verwenden:

Code: Alles auswählen

#!/bin/bash
FD0=$(ls -l /proc/$$/fd/0|awk '{print $NF}')
if [ -t 0 ]; then
  echo "STDIN is terminal: $FD0"
else
  echo "STDIN is: $FD0"
fi

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Daten per PIPE an eigenes Script übergeben

Beitrag von Meillo » 28.03.2011 01:03:40

peddy hat geschrieben: ich finde das Verketten von Befehlen über eine Pipe sehr praktisch und würde das auch gern für eigene Programme nutzen.
Das ist schoen und lobenswert.
Das Problem ist nur, dass mein Script die Daten nur optional über eine Pipe bekommen soll. Bei einem Aufruf von ./meinscript.sh soll es sich anders verhalten.
Das ist schlecht und somit ist dringend davon abzuraten. Es widerspricht den Konzepten von Unix und wird demnach vorraussichtlich zu Problemen fuehren da es anders arbeitet als des Restsystem. Zudem verlierst du dadurch die Flexibilitaet die Unix ja gerade auszeichnet. (Schon mal gewundert, dass sich `ls' anders verhaelt ob man es interaktiv oder in einer Pipe aufruft?)

Wenn dein Script sich anders verhalten soll, dann baue einen Kommandozeilenswitch ein der das Verhalten aendert.
Use ed once in a while!

Antworten