readpipe#
Εκτελεί μια εντολή κελύφους και επιστρέφει την τυπική της έξοδο.
Η readpipe παραδίδει την EXPR στο κέλυφος, περιμένει να τελειώσει το παιδί, και επιστρέφει ό,τι έγραψε το παιδί στην τυπική του έξοδο. Είναι η μορφή με όνομα του τελεστή qx (backticks) - και το `cmd` και το qx/cmd/ μεταγλωττίζονται κάτω σε readpipe. Καταφύγετε στη μορφή με όνομα όταν θέλετε την εντολή σε μεταβλητή, όταν θέλετε να καταστείλετε την παρεμβολή διπλών εισαγωγικών που εκτελεί η qx, ή όταν θέλετε να διαβάσετε μια αποτυπωμένη εντολή από το @ARGV. Αν η EXPR παραλείπεται, χρησιμοποιείται η $_.
Σύνοψη#
readpipe EXPR
readpipe
$out = readpipe $cmd;
@rows = readpipe $cmd;
Τι επιστρέφεται#
Το περιβάλλον αποφασίζει το σχήμα:
Βαθμωτό περιβάλλον - μία συμβολοσειρά που περιέχει ολόκληρη την αποτυπωμένη έξοδο, μαζί με τα newlines.
Περιβάλλον λίστας - λίστα εγγραφών, διασπασμένων επί της
$/(ο διαχωριστής εγγραφών εισόδου, newline προεπιλεγμένα). Ο διαχωριστής παραμένει προσαρτημένος σε κάθε στοιχείο εκτός αν τον αφαιρέσετε μεchomp.
Η $? τίθεται στην κατάσταση αναμονής του παιδιού αφού τελειώσει η εντολή, ακριβώς όπως με τη system. Μια μη μηδενική $? είναι το συνηθισμένο σήμα ότι η εντολή απέτυχε - η τιμή επιστροφής από μόνη της δεν μπορεί να σας το πει, καθώς μια εντολή που αποτυγχάνει μπορεί παρ” όλα αυτά να έχει γράψει έξοδο (ή τίποτα) πριν εξέλθει.
my $out = readpipe "uname -a";
die "uname failed: \$? = $?" if $?;
Καθολική κατάσταση που επηρεάζει#
$_- χρησιμοποιείται ως εντολή όταν ηEXPRπαραλείπεται.$/- ελέγχει πώς η έξοδος σε περιβάλλον λίστας διασπάται σε εγγραφές. Θέστε το σεundefγια να ρουφήξετε ολόκληρη την έξοδο σε ένα μόνο στοιχείο, ή σε""για λειτουργία παραγράφου.$?- τίθεται στην κατάσταση αναμονής του παιδιού κατά την επιστροφή.$!- τίθεται αν το ίδιο το κέλυφος δεν μπόρεσε να εκκινήσει.%ENV- το κέλυφος κληρονομεί το τρέχον περιβάλλον.
Παραδείγματα#
Αποτύπωση μίας γραμμής εξόδου:
my $host = readpipe "hostname";
chomp $host;
print "running on $host\n";
Εντολή αποθηκευμένη σε μεταβλητή - ο λόγος που υπάρχει η readpipe ως συνάρτηση με όνομα. Τα backticks θα λειτουργούσαν επίσης εδώ, αλλά η readpipe καθιστά την πρόθεση ρητή και αποφεύγει τον οπτικό θόρυβο της εμφωλευμένης χρήσης εισαγωγικών:
my $cmd = "ls -1 /etc";
my @entries = readpipe $cmd;
chomp @entries;
print scalar(@entries), " entries under /etc\n";
Ρούφηγμα όλων σε μία συμβολοσειρά απενεργοποιώντας τον διαχωρισμό εγγραφών:
local $/; # slurp mode
my $log = readpipe "dmesg";
print length($log), " bytes of kernel log\n";
Λειτουργία παραγράφου - κάθε στοιχείο είναι ένα μπλοκ διαχωρισμένο με κενή γραμμή:
local $/ = "";
my @paragraphs = readpipe "cat README";
print scalar(@paragraphs), " paragraphs\n";
Ελέγξτε την κατάσταση εξόδου σωστά. Η τιμή επιστροφής είναι η έξοδος· η επιτυχία ζει στην $?:
my @files = readpipe "find . -name '*.tmp' 2>/dev/null";
if ($? == 0) {
chomp @files;
unlink @files;
} else {
warn "find exited with status ", ($? >> 8), "\n";
}
Χρησιμοποιήστε την $_ ως εντολή. Σπάνια η πιο σαφής μορφή, αλλά νόμιμη:
$_ = "date";
my $when = readpipe; # same as readpipe $_
Οριακές περιπτώσεις#
Καμία προστασία από παρεμβολή. Η
readpipeπαρεμβάλλει το όρισμά της ακριβώς όπως μια συμβολοσειρά σε διπλά εισαγωγικά - όπως και ηqx. Ηreadpipe "rm $path"με την$pathνα προέρχεται από είσοδο χρήστη είναι τρύπα ένεσης κελύφους. Παραθέστε την τιμή σε εισαγωγικά, ή καλύτερα, στρέψτε σε μορφή λίσταςsystem/ pipedopenκαι παρακάμψτε το κέλυφος εντελώς.Η τυπική έξοδος σφαλμάτων δεν αποτυπώνεται. Επιστρέφει μόνο η τυπική έξοδος του παιδιού. Ανακατευθύνετε την stderr μέσα στην ίδια την εντολή αν θέλετε να συγχωνευθεί:
readpipe "cmd 2>&1".Το κέλυφος είναι υποχρεωτικό. Ακόμη και μια μονολεκτική
readpipe "true"περνά μέσα από το/bin/sh, που σημαίνει ότι ισχύουν τα εισαγωγικά κελύφους, το globbing και η ανάπτυξη μεταβλητών περιβάλλοντος. Δεν υπάρχει μορφή λίστας.Μεγάλη ενταμίευση εξόδου στη μνήμη. Ολόκληρη η έξοδος του παιδιού διαβάζεται πριν επιστρέψει η
readpipe. Για εντολή που παράγει gigabytes, χρησιμοποιήστε αντ” αυτού pipedopenκαι διαβάστε σταδιακά.Κενή έξοδος, μηδενική έξοδος. Μια επιτυχημένη εντολή που δεν γράφει τίποτα επιστρέφει την κενή συμβολοσειρά σε βαθμωτό περιβάλλον και την κενή λίστα σε περιβάλλον λίστας. Ξεχωρίστε το «έτρεξε και δεν είπε τίποτα» από το «δεν έτρεξε ποτέ» ελέγχοντας την
$?.Child died on signal.
$?encodes both exit code and signalmask with
$? & 127to get the signal number,$? >> 8for the exit code.
Κανόνες εισαγωγικών στα Windows. Η
readpipeπαραδίδει τη συμβολοσειρά στο κέλυφος της πλατφόρμας· στα Windows αυτό είναι τοcmd.exe, του οποίου οι κανόνες εισαγωγικών και ανακατεύθυνσης διαφέρουν από το POSIX. Η pperl είναι μόνο για Linux, οπότε αυτό είναι σχετικό μόνο όταν εισάγετε σενάρια προς αυτήν.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
qx- η μορφή τελεστή· τα`cmd`καιqx/cmd/είναι συντομογραφία τηςreadpipeκαι φέρουν ταυτόσημη σημασιολογίαsystem- εκτελέστε εντολή χωρίς αποτύπωση εξόδου· χρησιμοποιήστε την όταν σας ενδιαφέρει μόνο η κατάσταση εξόδουexec- αντικαθιστά την τρέχουσα διεργασία με την εντολή· καμία επιστροφή, καμία αποτύπωσηopen- piped open (open my $fh, "-|", @cmd) ροεί την έξοδο του παιδιού γραμμή-προς-γραμμή χωρίς να την ενταμιεύει ολόκληρη$?- κατάσταση αναμονής παιδιού που τίθεται από κάθε ενσωματωμένη που εκκινεί διεργασία$/- διαχωριστής εγγραφών εισόδου που διασπά την έξοδο σε περιβάλλον λίστας