# sh: forken und testen

## Mr. Anderson

Hallo,

wie stellt man das denn an? Ich möchte mit find bestimmte Dateien zusammentragen und diese dann mit tar packen. Das ginge zum Beispiel ja so:

```
find foo -mtime -1 -print | tar -czpf foo.tgz -T -
```

Nun möchte ich aber bei beiden Prozessen Fehler abfangen.

Wären sie nicht gepiped, könnte ich das so machen:

```
find foo -mtime -1 -print && tar -czpf foo.tgz -T -
```

Aber das geht nicht, weil jetzt nicht stdout von find zu stdin von tar umgeleitet wird.

Mit nem FIFO geht das auch nicht, denn bei

```
mkfifo foo.fifo

find foo -mtime -1 -print > foo.fifo && tar -czpf foo.tgz -T - <foo.fifo
```

blockiert find bis foo gelesen wird, was aber erst passieren kann, wenn find nicht mehr blockiert. Also ein Deadlock. Die Prozesse müssen gleichzeitig laufen.

Das da geht natürlich auch nicht:

```
mkfifo foo.fifo

find foo -mtime -1 -print > foo.fifo & && tar -czpf foo.tgz -T - <foo.fifo
```

sonst wäre && ja kein lazy operand.

klar, ich kann es in einer Datei zwischenspeichern, aber so glücklich bin ich nicht damit, da das eigentlich überflüssig ist.

Hat mir jemand einen Tipp?

----------

## Silicoid

Hi

 *Mr. Anderson wrote:*   

> 
> 
> ```
> find foo -mtime -1 -print | tar -czpf foo.tgz -T -
> ```
> ...

 

was möchtest du genau tun? Welche Fehler abfangen und was soll bei einem Fehler passieren.

Den einzigen "Fehler" den ich mir bei find jetzt spontan vorstellen kann ist "permission denied". Dann wird das Ding halt nicht gesichert. Bei tar könnte jetzt z.B. das File, daß find gefunden hat, inzwischen gelöscht sein.

----------

## Mr. Anderson

Das ist eine Zeile aus einem Backup-Skript.

Ich möchte, dass ganz allgemein geprüft wird, dass find und tar beide 0 als Fehlercode zurückgeben, also keinen Fehler. (Wenn find nicht mit 0 terminiert, kann trotzdem tar mit 0 terminieren und umgekehrt.)

Es kann ja sonstwas passieren. Aus irgendeinem Grund ist vielleicht kein Plattenplatz mehr vorhanden. Oder eine der Binaries hat einen Schaden bekommen oder der RAM hat nen Fehler oder oder oder...

----------

## Silicoid

Hi

 *Mr. Anderson wrote:*   

> 
> 
> ```
> find foo -mtime -1 -print | tar -czpf foo.tgz -T -
> ```
> ...

 

ohne es probiert zu haben:

```
(find foo -mtime -1 -print; echo $? > exit_find) | (tar -czpf foo.tgz -T -; echo $? > exit_tar) 
```

Damit solltest du danach in den Files exit_find und exit_tar die Returncodes haben.

----------

## Mr. Anderson

Danke. Ja, der Befehl funktioniert. An sich hatte ich gehofft, auszukommen, ganz ohne in Dateien zu schreiben, aber das bringt mich schon ein ganzes Stück weiter.

----------

## mv

bash?

```
command1 | command2

[[ "${PIPESTATUS[0]}" -ne 0 || "${PIPESTATUS[1]}" -ne 0 ]] && echo BOOM
```

----------

