-1

Когда я делаю PS, PS покажет это в списке.
Но когда я делаю PS | grep hello, хотя ps - это процесс, grep - это показанный процесс.
Трубы так работают?
Как канал автоматически считывается?
Спасибо

1 ответ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/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .