LINUX.ORG.RU

Странное поведение фонового запуска в bash-скрипте

 , ,


0

1

Привет.
Кто-нибудь может объяснить нижеследующее?

Реквизит:
1) скрипт «cat_stdin.sh»

#!/bin/bash
cat /dev/stdin > pipe1
2) именованные каналы pipe1 и pipe2;
3) zip-архив;
4) libarchive-tools
5) tmux с тремя «окнами»;

Вариант 1 (работает):
Окно1: cat archive.zip | ./cat_stdin.sh
Окно2: cat pipe1 | tee pipe2 | buffer > /dev/null
Окно3: cat pipe2 | bsdtar -tf-

Вывод (листинг архива):
file1.txt
file2.txt
file3.txt

А теперь, если в скрипте «cat_stdin.sh» увести команду в фон, вся конструкция не работает, листинга архива не получается.
#!/bin/bash
cat /dev/stdin > pipe1 & # <--- С этим амперсандом не работает
При этом «ps -A | grep cat_stdin» показывает, что «cat_stdin.sh» запущен.
Почему так, кто-нибудь знает/можете объяснить?


При переводе процесса в фоновый режим stdin отключается.

Всегда ваш, Капитан Очевидность.

Aceler ★★★★★
()

окно 1

$ printf "1\n2\n3\n" | (cat > pipe1&) # <-- с амперсандом! просто cat без /dev/stdin

окно 2

$ cat pipe1 | tee pipe2
1
2
3

окно 3

$ cat pipe2
1
2
3
anonymous
()
Ответ на: комментарий от Jeronimo

Максимально придерживался исходной постановки задачи, чтобы не нагружать лишним вопрошающего. Насколько знаю, cat умеет трубить.

anonymous
()
Ответ на: комментарий от Aceler

Спасибо, Кэп. При простом взгляде на код хочется сказать: «Берёт stdin и уходит с ним в фон».

An12
() автор топика
Ответ на: комментарий от gagarin0

Спасибо! Ключевая фраза: «перенаправление осуществляется перед выполнением команды».

Можно извернуться и запускать команды в обратном порядке:
сначала уводить в фон перенаправление из pipe1 в pipe2, а потом, последним шагом, лить данные из stdin в pipe1 без увода в фон.

An12
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.