Hoe kan ik een shell-commando aanroepen in mijn Perl-script?

Wat zou een voorbeeld zijn van hoe ik een shell-opdracht kan aanroepen, zeg ‘ls -a‘ in een Perl-script en de manier om ook de uitvoer van de opdracht op te halen?


Antwoord 1, autoriteit 100%

Een shellscript uitvoeren vanuit een Perl-programma

1. Met behulp van systeem system($command, @arguments);

Bijvoorbeeld:

system("sh", "script.sh", "--help" );
system("sh script.sh --help");

Systeem zal het $commando uitvoeren met
@arguments en keer terug naar je script als je klaar bent. U kunt $!
voor bepaalde fouten die door de externe toepassing aan het besturingssysteem zijn doorgegeven. Lezen
de documentatie voor het systeem voor de nuances van hoe verschillende
aanroepingen zijn iets anders.

2. Gebruik exec

Dit lijkt erg op het gebruik van systeem, maar het zal
beëindig uw script bij uitvoering. Nogmaals, lees de documentatie
voor execvoor meer informatie.

3. Backticks of qx//

. gebruiken

my $output = `script.sh --option`;
my $output = qx/script.sh --option/;

De backtick-operator en zijn equivalent qx//, voeren het commando en de opties binnen de operator uit en retourneren de uitvoer van de commando’s naar STDOUT wanneer het klaar is.

Er zijn ook manieren om externe applicaties uit te voeren door creatief gebruik van open, maar dit is geavanceerd gebruik; lees de documentatie voor meer.


Antwoord 2, autoriteit 22%

Van Perl HowTozijn de meest voorkomende manieren om externe opdrachten vanuit Perl uit te voeren:

  • my $files = `ls -la`— legt de uitvoer van de opdracht vast in $files
  • system "touch ~/foo"— als je de uitvoer van de opdracht niet wilt vastleggen
  • exec "vim ~/foo"— als je niet wilt terugkeren naar het script na het uitvoeren van de opdracht
  • open(my $file, '|-', "grep foo"); print $file "foo\nbar"— als je invoer in de opdracht wilt pipen

Antwoord 3, autoriteit 16%

Voorbeelden

  1. `ls -l`;
  2. system("ls -l");
  3. exec("ls -l");

Antwoord 4, autoriteit 14%

Kijk naar de functie openin Perl – vooral de varianten die een ‘|’ gebruiken (pijp) in de argumenten. Als je het goed doet, krijg je een bestandshandle die je kunt gebruiken om de uitvoer van de opdracht te lezen. De back-tick-operators doen dit ook.

Misschien wilt u ook controleren of Perl toegang heeft tot de C-functies die het commando zelf gebruikt. Voor ls -akunt u bijvoorbeeld de opendirfunctie, en lees dan de bestandsnamen met de functie readdiren sluit tenslotte de map met (verrassing) de functie closedir. Dit heeft een aantal voordelen: precisie is waarschijnlijk belangrijker dan snelheid. Met behulp van deze functies kunt u de juiste gegevens krijgen, zelfs als de bestandsnamen oneven tekens bevatten, zoals newline.


Antwoord 5, autoriteit 11%

Naarmate u meer ervaring krijgt met het gebruik van Perl, zult u merken dat er steeds minder gevallen zijn waarin u shell-commando’s moet uitvoeren. Een manier om bijvoorbeeld een lijst met bestanden te krijgen, is door Perl’s ingebouwde globte gebruiken. functie. Als u de lijst in gesorteerde volgorde wilt hebben, kunt u deze combineren met de ingebouwde sorteer-functie . Als u details over elk bestand wilt, kunt u de functie statgebruiken. Hier is een voorbeeld:

#!/usr/bin/perl
use strict;
use warnings;
foreach my $file ( sort glob('/home/grant/*') ) {
    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
        = stat($file);
    printf("%-40s %8u bytes\n", $file, $size);
}

Antwoord 6, autoriteit 7%

Er zijn veel manieren waarop u een shell-opdracht kunt aanroepen vanuit een Perl-script, zoals:

  1. back tick
    lsdie de uitvoer vastlegt en teruggeeft aan u.
  2. -systeem
    systeem (‘ls’);
  3. open

Verwijs # 17 hier: Perl-programmeertips


Antwoord 7

Misschien wilt u onderzoeken in open2 en open3 in het geval je hebt bidirectionele communicatie nodig.

Other episodes