Ένα κομμάτι της ανακατεύθυνσης του φλοιού
Εδώ είναι το πώς κάνουμε κανονικά ανακατεύθυνσης του φλοιού
$ ./pgm.sh args >out.txt 2>err.txt
Ήθελα να το τροποποιήσετε ένα κομμάτι και να είναι ως εξής
$ ./pgm.sh args
με την προϋπόθεση ότι η παραγωγή και το λάθος θα πρέπει να πάνε σε κάποιο όνομα αρχείου μέσα pgm.sh υπολογίζεται με βάση args. Ένα ενδεικτικό περίπτωση θα μπορούσε να είναι η ημερομηνία έναρξης είναι μέρος του args. Έτσι, θα θέλατε να πάτε stdout να πω / / κατάλογο σας / pgm_out_YYYYMMDD.txt 1
Το πρόβλημα με τυποποιημένο τρόπο αναπροσανατολισμό N>file.txt δηλαδή, που συνδέει τον περιγραφέα αρχείου N στο file.txt, είναι ότι λειτουργεί μόνο για το νέο διχαλωτή διαδικασία και όχι για την τρέχουσα διαδικασία.
έτσι
$ echo hi 1>out.txt ; echo hii . θα στείλει γεια σε out.txt αλλά θα τυπώσει στο stdout hii 2
Αυτό είναι όπου exec έρχεται να μας σώσει. Αν προσθέσουμε exec 1>somefile.txt τότε η έξοδος από το υπόλοιπο του σεναρίου θα πάει να somefile.txt
$. / Test.sh θα ανακατευθύνει γεια καθώς και hii να out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Ομοίως να ανακατευθύνει stdout καθώς και stderr θα κάνουμε κάτι σαν αυτό
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Τώρα επιστρέφοντας στο αρχικό σημείο του αναπροσανατολισμού σε κάποιο αρχείο από το εσωτερικό του κελύφους, ας πούμε πρόγραμμα υπολογίζεται το όνομα του αρχείου σε κάποια μεταβλητή outfile, θα μπορούσαμε να είχαμε κάνει μόλις exec 1>$OUTFILE
Αυτό λύνει το πρόβλημα. Αλλά μπορεί να θέλετε να πάτε μέσω ακόλουθο παράδειγμα που επιτυγχάνει «τυχαίας προσπέλασης» του αρχείου στο σενάριο κελύφους. Παράδειγμα είναι από εδώ
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
Με τις παρατηρήσεις, ο κωδικός αυτός είναι αυτονόητα.
-
1 Μπορεί επίσης να γίνει από $ ./pgm.sh args >pgm_out`date +%Y%m%d` , αλλά η ιδέα είναι να δημιουργήσει αυτό το όνομα αρχείου με βάση κάποια λογική στο ίδιο το πρόγραμμα.
2 1 1> out.txt είναι περιττή, αλλά διευκρινίζει ότι εδώ είμαστε αναπροσανατολισμό fd 1



































