/ / <operator w systemie UNIX, przekazanie do skryptu Perla - perl, linia poleceń, stdin

<operator w systemie UNIX, przekazywanie do skryptu Perla - perl, linia poleceń, stdin

Podczas oceniania if(-t STDIN), czy operator <UNIX liczy się jako STDIN? Jeśli nie, w jaki sposób mogę uzyskać te dane?

Więc ktoś typy perl example.pl < testing.txt. To nie zachowuje się jak dane przesyłane przez via ls | ./example.pl. Jak mogę uzyskać to zachowanie?

Odpowiedzi:

5 dla odpowiedzi № 1

Test -p STDIN, który sprawdza, czy uchwyt pliku STDIN jest podłączony do rury.

touch foo
perl -e "print -p STDIN" < foo            # nothing
cat foo | perl -e "print -p STDIN"        # 1

Ale nie jestem pewien, czy rozumiem twoje pytanie we wszystkich tych trzech przypadkach

1.  perl -e "print $_=<STDIN>" < <(echo foo)
2.  echo foo | perl -e "print $_=<STDIN>"
3.  perl -e "print $_=<STDIN>"          # then type "foon" to the console

dane wejściowe są takie same i wszystkie dostępne za pośrednictwem STDIN uchwyt pliku. W pierwszych dwóch przypadkach -t STDIN oceni na false, a w drugim przypadku -p STDIN będzie prawdą.

Różnice w zachowaniu między tymi trzemasprawy są subtelne i zazwyczaj nieistotne. Trzeci przypadek, oczywiście, będzie czekać, aż zostanie odebrany co najmniej jeden wiersz wejścia (zakończony "n" lub EOF). Różnica między dwoma pierwszymi przypadkami jest jeszcze bardziej subtelna. Kiedy dane wejściowe do twojego programu są wyprowadzane z wyjścia innego procesu, jesteś nieco zdany na łaskę tego pierwszego procesu w odniesieniu do opóźnienia lub tego, czy program buforuje jego wyjście.

Może mógłbyś rozwinąć to, co masz na myśli, kiedy mówisz

perl example.pl < testing.txt

nie zachowuje się jak

ls | ./example.pl

2 dla odpowiedzi nr 2

-t sprawdza, czy STDIN jest dołączony do tty.

Podczas przesyłania danych do perla nie zostanie dołączony do tty. Nie powinno to zależeć od mechanizmu używanego do potokowania (tj | lub potokuj plik za pomocą <.) Jednak będziesz mieć załączone tty, gdy uruchomisz program bezpośrednio. Biorąc pod uwagę następujący przykład:

#!/usr/bin/perl
print ((-t STDIN) ? "is a ttyn" : "is not a ttyn");

Można oczekiwać następującego wyniku:

% perl ./ttytest.pl
is a tty
% perl ./ttytest.pl < somefile
is not a tty
% ls | perl ./ttytest.pl
is not a tty