Być może już na to odpowiedziano, z przyjemnością powitam link do innej odpowiedzi ...
Jeśli wykonam polecenie powłoki (w bash
powłoce) w następujący sposób:
make
Wtedy, gdy odtwarzany make
jest przez przewijanie z STDOUT
tego make
polecenia, jeśli typ make check
i naciśnij enterprzed pierwszym wykonaniem polecenia jest zakończone, gdy make
polecenie ostatecznie zakończy następnego polecenia make check
odbierze prawo i uruchomić.
Moje pytania są po prostu:
- Czy to niebezpieczne?
- Czy są jakieś potencjalne nieoczekiwane zachowania z tego rodzaju pisania w pośpiechu?
- Dlaczego to działa tak, jak działa?
Odpowiedzi:
Działa tak, jak działa, ponieważ Unix ma pełny dupleks. Jak powiedział Ritchie Systemie dzielenia czasu UNIX: Retrospektywa :
[koniec cytatu]
To powiedziawszy, istnieją pewne nowoczesne programy, które pochłaniają lub odrzucają jakiekolwiek typy;
ssh
iapt-get
są dwoma przykładami. Jeśli wpiszesz naprzód, gdy są uruchomione, może się okazać, że pierwsza część wpisu zniknęła. To może być problem.źródło
bash
fork()
s iexec
s pierwsze polecenie jest nadal dołączone doSTDIN
powłoki bash? Wygląda na to, że odpowiedź brzmi nie, bash wydaje się buforować następną komendę. Czy to jest poprawne?&
.STDIN
traktowany w sposób fifo? I przypuszczam, że chyba że proces potomny basha jawnie zamyka odziedziczony uchwyt pliku,STDIN
to nadal mógłby czytać z dodatkowego pisania?Podstawowe zachowanie, które widzisz, polega na tym, że dane wejściowe znajdują się gdzieś w buforze, dopóki nie zostaną odczytane (cóż, jeśli wpiszesz wystarczająco dużo, w końcu bufory się zapełnią i coś zostanie utracone, to byłoby dużo pisania). Większość rzeczy uruchamianych przez make nie odczytuje ze STDIN, więc pozostaje w buforze.
Niebezpieczeństwo polega na tym, że niewłaściwe polecenie odczytuje dane wejściowe. Na przykład
make
wywołuje coś, co decyduje o wyświetleniu monitu, a następnie może odczytać następne polecenie jako odpowiedź. To, jak niebezpieczne jest to zależy oczywiście od polecenia. (Mogą również najpierw wyczyścić wszystkie dane wejściowe, po prostu odrzucając poprzednie dane).Jednym z poleceń, powszechnie używanym w Makefiles, które może to zrobić, jest TeX. Jeśli napotka błąd (i nie otrzyma flagi, aby nigdy nie pytać użytkownika), wyświetli monit o kontynuację.
Lepszym rozwiązaniem jest chyba do biegu:
make && make check
.źródło
make
pomyślnego wykonania pierwszego polecenia ( w twoim przykładzie). Na przykładmake foo
Enter>./foo
Enter może powodować problem. Możesz spróbować przyzwyczaić się do pisania takich rzeczy, jak np.make && make check
Gdzie drugie polecenie zostanie wykonane tylko wtedy, gdy pierwsze się powiedzie.make check
, skończyłbyś wykonywaniem poleceniaheck
, które prawdopodobnie nie istnieje w twoim systemie (ale może być czymś paskudnym). Jeśli pierwsze polecenie jest czymś łagodnym, co znasz i którym ufasz, nie widzę od razu żadnego problemu.źródło
ls
Imount
na przykład. Próbuję zrozumieć, jak obsługiwane jest buforowane wejście. Dziękuję za odpowiedź.