bash redirection to pipes (SOLVED)

Γιώργος Πάλλας gpall at ccf.auth.gr
Thu Apr 9 15:59:45 EEST 2009


Giorgos Keramidas wrote:
> On Tue, 07 Apr 2009 21:42:46 +0300, Γιώργος Πάλλας <gpall at ccf.auth.gr> wrote:
>   
>> Προσπαθώ να βρω πως θα κάνω ταυτόχρονα redirect το standard error και
>> το standard output του tar, και τα δυο σε δυο pipes προς δυο
>> διαφορετικά gpg. Το σκεπτικό είναι να παίρνω ένα encrypted αρχείο με
>> τη λίστα των αρχείων που έγιναν tar (σαν index ας πούμε) και το
>> encrypted tar σε ένα άλλο ξεχωριστό αρχείο.
>>
>> tar cv /media/abyss/mydata/   2>(gpg -e -r gpall -o lista_arxeiwn.gpg)
>> 1>(gpg -e -r gpall -o encrypted_tar.gpg)
>>
>> Δεν θα έπρεπε αυτό να παίζει;;
>>     
>
> Κοίτα στα αρχεία της λίστας.
>
> Hint: Έχω ήδη κάνει post τη λύση στο:
>
> http://groups.google.com/group/local.linux.greek.users/msg/00e33bac46e070ad
>
>
>   


Γιώργο, στο mail που είχες στείλει, γράφεις:

> Ή dup() σε shell syntax σε ένα temporary file descriptor:
>
>     $ ( echo foo ; echo lala >&2 ) > /dev/null
>     lala
>
>     $ ( ( echo foo ; echo lala >&2 ) 3<&1 1<&2 2<&3 ) > /dev/null
>     foo
>
> Και στις δύο φορές το stdout πάει στο /dev/null.  Απλά τη δεύτερη έχει
> γίνει `swap' το stdout με το stderr. 

Νομίζω ότι αυτό δεν αποτελεί κάποια λύση στο πρόβλημα που περιέγραψα...

Η λύση στο πρόβλημά μου αφού το παίδεψα κάμποσο χθες βράδυ προσπαθώντας 
να καταλάβω τον μαγικό κόσμο των shell redirections και του process 
substitution ήταν ακόμα δυο '>' !

Aυτό δοκίμαζα και δεν έπαιζε:
tar cv /media/abyss/mydata/   2>(gpg -e -r gpall -o lista_arxeiwn.gpg) 1>(gpg -e -r gpall -o encrypted_tar.gpg)

ενώ αυτό έπαιξε:
tar cv /media/abyss/mydata/ 2> >(gpg -e -r gpall -o lista_arxeiwn.gpg) 
1> >(gpg -e -r gpall -o encrypted_tar.gpg)

To πρόβλημα ήταν σχετικά υποχθόνιο για την μικρή εμπειρία μου: (γονείς 
απομακρύνετε παιδιά κάτω των 16 ετών)

Η κλασσική χρήση του redirection είναι:

command 1>filename   ή
command 2>filename   ή γενικότερα:
command fd>filename
(όπου fd -> file descriptor)

Eγώ δεν ήθελα όμως να πάει η έξοδος σε κάποιο filename αρχείο 
κατευθείαν, αλλά να περάσει πρώτα μέσα από κάποιο άλλο command (gpg). 
Υπάρχει η κλασσική μέθοδος της πίπας η οποία όμως λειτουργεί μόνο για να 
συνδέει την standard output (fd = 1) μια εντολής με την standard input 
(fd = 0) της επόμενης. Παράδειγμα:
command1 | command2
πχ.
cat config | grep connections

Εγώ όμως ήθελα και την standard error να περάσω μέσα από κάποιο command 
αλλά και την standard input μέσα από άλλο command. Και ως γνωστόν, δυο 
πίπες ταυτόχρονα δεν γίνονται. Oπότε δεν ωφελούσε να ανακατευθύνω την 
standard error στην standard input ή κάτι παρόμοιο (απάντηση Κεραμίδα 
(ΑΝ την κατάλαβα καλά)), γιατί τις ήθελα και τις δυο ξεχωριστά.

H μόνη προσέγγιση που βρήκα λοιπόν ήταν να χρησιμοποιήσω το κλασσικό 
redirection το οποίο σαν ένα πρώτο βήμα μπορεί να χρησιμοποιηθεί για να 
στείλει stderr και stdout σε δυο ξεχωριστά αρχεία:
command 1>output_stdout 2>output_stderr

To επόμενο βήμα είναι αντί να πηγαίνουν οι έξοδοι σε δυο αρχεία, να 
αντικαταστήσω τα αρχεία εξόδου (output_stdout, output_stderr) με 
redirections σε processes. Δηλαδή, όπου 'output_stdout' να βάλω 
'>(command)'.
Έτσι η εντολή γίνεται:
command 1> >(command2)    2> >(command3)

To οποίο παίζει μια χαρά:
ls -la /tmp/ tsaprr 2> >(cat > error) 1> >(cat > filelist)
στέλνοντας το μεν error output στο αρχείο 'error' *μέσω process όμως*, 
και ομοίως για το κανονικό output.
(και παίρνει και το Redundant cat Award).

Αυτά τα ολίγα, και ελπίζω χρήσιμα...

Γ.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 9953 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.hellug.gr/pipermail/linux-greek-users/attachments/20090409/7fa9ac67/attachment.bin>


More information about the Linux-greek-users mailing list