Mam skrypt bash, który przypomina śledzenie
cat filename | while read line
do
read input;
echo $input;
done
ale to wyraźnie nie daje mi właściwego wyniku, ponieważ kiedy czytam w pętli while, próbuje odczytać z nazwy pliku pliku z powodu możliwego przekierowania we / wy.
Jakiś inny sposób na zrobienie tego samego?
bash
while-loop
w2lame
źródło
źródło
Odpowiedzi:
Odczytaj z kontrolnego urządzenia końcowego:
więcej informacji: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
źródło
bash yourscript < /foo/bar
będzie czekać na wprowadzenie danych przez użytkownika, jest to dopuszczalne tylko podczas odczytu haseł. Odpowiedź udzielona przez @GordonDavisson jest preferowana do wszystkich innych zastosowań.Możesz przekierować zwykłe stdin przez jednostkę 3, aby zachować ją w potoku:
BTW, jeśli naprawdę używasz
cat
tego sposobu, zamień go na przekierowanie, a wszystko stanie się jeszcze prostsze:Lub możesz zamienić stdin i jednostkę 3 w tej wersji - przeczytaj plik za pomocą jednostki 3 i po prostu zostaw stdin w spokoju:
źródło
read line
czyta z notify-finish, ale jeśli po prostu uruchomisz to tak, jak napisano,read -u 3 input
czyta z konsoli)?Wygląda na to, że przeczytałeś dwukrotnie, odczyt wewnątrz pętli while nie jest potrzebny. Nie musisz też wywoływać polecenia cat:
źródło
read
jako „nie w porządku [ponieważ] próbuje odczytać z plikufilename
”), jak i przyjętej odpowiedzi.Spróbuj zmienić pętlę w ten sposób:
Test jednostkowy:
źródło
Znalazłem ten parametr -u z odczytem.
„-u 1” oznacza „czytaj ze standardowego wejścia”
źródło
źródło