Передача нескольких команд в bash, вопрос поведения канала - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть последовательность команд, которую я не могу понять:

[me@mine ~]$ (echo 'test'; cat) | bash
echo $?
1
echo 'this is the new shell'
this is the new shell
exit

[me@mine ~]$ 

Насколько я понимаю, вот что происходит:

  1. Труба создана.
  2. стандартный вывод echo 'test' отправляется в канал.
  3. bash получает 'test' на стандартный ввод.
    • echo $? возвращает 1, что происходит, когда вы запускаете test без аргументов.
  4. cat работает.
    • Копирует стандартный ввод в стандартный вывод.
    • стандартный вывод отправляется на канал.
  5. bash выполнит все, что вы введете, но stderr не будет выведен на экран (мы использовали |, а не |&).

У меня три вопроса:

Похоже, что хотя мы запускаем две команды, мы используем один и тот же канал и bash процесс для обеих команд. Это тот случай?

Куда идут подсказки?

Когда что-то наподобие cat использует stdin, требуется ли ему эксклюзивное владение stdin, пока работает оболочка, или другие вещи могут его использовать?

Я подозреваю, что мне не хватает некоторых деталей с ttys, но я не уверен. Любая помощь или детали или man выдержка приветствуется!

1 Ответ

0 голосов
/ 04 сентября 2018

Итак ...

  1. Да, один канал отправляет команды в один экземпляр bash. Примечание:

    $ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash
    22:18:52 hello 72628
    22:18:53 world 72628
    
  2. Нет подсказок. Со страницы руководства:

    Интерактивная оболочка запускается без необязательных аргументов (если не указан параметр -s) и без опции -c , стандартный ввод и ошибка которых оба связаны с терминалами. PS1 установлен и $ - включает i , если bash является интерактивным .

    Таким образом, канал не является интерактивной оболочкой и поэтому не имеет приглашения.

  3. Stdin и stdout могут подключаться одновременно только к одной вещи. cat возьмет stdin из процесса, который запустил его (например, вашу интерактивную оболочку), и отправит свой стандартный вывод по каналу на bash. Если вам нужно несколько вещей, чтобы иметь возможность отправлять на стандартный ввод этого cat, рассмотрите возможность использования именованного канала.

Это покрывает это?

...