Каждый процесс в системе Linux (и большинство других) имеет, по меньшей мере, 3 открытых дескрипторов файлов:
- STDIN (0)
- стандартный вывод (1)
- STDERR (2)
Regualary каждый из этих файловых дескрипторов будет указывать на т он терминал, с которого начался процесс. Как это:
cat file.txt # all file descriptors are pointing to the terminal where you type the command
Однако Баш позволяет изменить это поведение с помощью input/output redirection:
cat < file.txt # will use file.txt as stdin
cat file.txt > output.txt # redirects stdout to a file (will not appear on terminal anymore)
cat file.txt 2> /dev/null # redirects stderr to /dev/null (will not appear on terminal anymore
То же самое происходит, когда вы используете символ трубы, как:
wget -q http://192.168.0.1/test -O - | grep -m 1 'Hello'
Что такое на самом деле происходит то, что stdout процесса wget (процесс до |) перенаправляется на stdin процесса grep. Таким образом, stdout wget больше не является терминалом, а выход grep - текущим терминалом. Если вы хотите перенаправить вывод grep в файл, например, используйте следующее:
wget -q http://192.168.0.1/test -O - | grep -m 1 'Hello' > output.txt
Итак, в моем конкретном примере вывод направляется на терминал, который в этом случае является стандартным? – 0xSina
Немного обновили. Надеюсь, это упростит ситуацию. – hek2mgl