Когда я делаю PS, PS покажет это в списке.
Но когда я делаю PS | grep hello, хотя ps - это процесс, grep - это показанный процесс.
Трубы так работают?
Как канал автоматически считывается?
Спасибо
1 ответ
2
хотя ps это процесс, grep это процесс, показанный
И ps
и grep
являются процессами. Вы просто не видите строку ps
потому что в ней нет слова "привет". Попробуйте, например, ps | вместо этого ps | grep ".*"
или даже ps | sort | tac | shuf
Другими словами, у вас есть:
Процесс 1:
ps aux
- Fd 0 (стандартный): терминал (/dev/tty)
- Fd 1 (стандартный вывод): анонимный канал (→ запись)
- Fd 2 (stderr): терминал
Процесс 2:
grep hello
- Fd 0 (stdin): анонимный канал (читать →)
- Fd 1 (стандартный вывод): терминал
- Fd 2 (stderr): терминал
работает одновременно.
Вот еще один интересный тест - попросите ls
показать свои дескрипторы файлов:
$ ls -l /proc/self/fd | cat lrwx------ 1 64 Jul 31 14:29 0 -> /dev/pts/1 l-wx------ 1 64 Jul 31 14:29 1 -> pipe:[8087631] lrwx------ 1 64 Jul 31 14:29 2 -> /dev/pts/1 lr-x------ 1 64 Jul 31 14:29 3 -> /proc/2150013/fd/ $ echo test | ls -l /proc/self/fd lr-x------ 1 64 Jul 31 14:29 0 -> pipe:[8086629] lrwx------ 1 64 Jul 31 14:29 1 -> /dev/pts/1 lrwx------ 1 64 Jul 31 14:29 2 -> /dev/pts/1 lr-x------ 1 64 Jul 31 14:29 3 -> /proc/2150022/fd/ $ echo test | ls -l /proc/self/fd | cat lr-x------ 1 64 Jul 31 14:30 0 -> pipe:[8088183] l-wx------ 1 64 Jul 31 14:30 1 -> pipe:[8088184] lrwx------ 1 64 Jul 31 14:30 2 -> /dev/pts/1 lr-x------ 1 64 Jul 31 14:30 3 -> /proc/2150056/fd/