Возможно, на это уже отвечали ранее, я бы приветствовал ссылку на другой ответ ...
Если я выполню команду оболочки (в bash
оболочке), как показано ниже:
make
Тогда в то время как выход из make
прокручивается на из STDOUT
-за make
команды, если я печатаю make check
и нажмите enterдо первой команды завершения выполнения, когда make
команда наконец заканчивает следующая команда make check
будет выбрать правильный и запустить.
Мой вопрос (ы) просто:
- Это опасно делать?
- Есть ли какие-либо потенциальные неожиданные поведения от этого вида арифметики?
- Почему это работает так, как работает?
Ответы:
Это работает так, как это происходит, потому что Unix полнодуплексный. Как сказал Ричи в UNIX-системе разделения времени: ретроспектива :
[конец цитаты]
Это, как говорится, есть некоторые современные программы, которые съедают или отбрасывают любой тип;
ssh
иapt-get
два примера. Если вы печатаете вперед, пока они работают, вы можете обнаружить, что первая часть вашего ввода исчезла. Это может быть проблемой.источник
bash
fork()
s иexec
s первая команда все еще прикреплена кSTDIN
оболочке bash? Похоже, что ответ «нет», bash, похоже, буферизирует следующую команду. Это верно?&
.STDIN
обрабатывается ли в фаворской манере? И я полагаю, что если дочерний процесс bash явно не закроет свой унаследованный дескриптор файла,STDIN
то он все равно сможет читать из дополнительной типизации?Основное поведение, которое вы видите, состоит в том, что ввод находится в буфере где-то до тех пор, пока он не будет прочитан (ну, если вы наберете достаточно, буферы в конечном итоге заполнятся, и что-то будет потеряно, хотя это будет много печатать). Большинство вещей, запускаемых make, не читают из STDIN, поэтому он остается в буфере.
Опасность заключается в том, что неправильная команда читает ваш ввод. Например,
make
вызывает что-то, что решит подсказать вам, а затем может прочитать вашу следующую команду в качестве ответа. Насколько это опасно, конечно, зависит от команды. (Они также могут сначала сбрасывать все входные данные, просто отбрасывая ваш предыдущий ввод.)Одна из команд, обычно используемая в Makefiles, это может быть TeX. Если он обнаружит ошибку (и ему не будет дан флажок, чтобы он никогда не предлагал пользователю), он подскажет, как вы хотите продолжить.
Лучшим вариантом является , вероятно, бежать:
make && make check
.источник
make
в вашем примере) выполнена успешно. Например,make foo
Enter>./foo
Enter может вызвать проблему. Возможно, вы захотите попробовать набрать такие вещи, какmake && make check
, например , когда вторая команда будет выполнена только в случае успеха первой.make check
, вы бы в итоге выполнили командуheck
, которая, вероятно, не существует в вашей системе (но может быть чем-то неприятным). Если первая команда - это что-то доброе, что вы знаете и которому доверяете, я не вижу никаких проблем.источник
ls
иmount
, например. Я пытаюсь понять, как обрабатывается буферный ввод. Спасибо за ответ.