
Я пишу приложение на C++ и мне нужно поработать с заменой процессов в оболочке Bash.
Я пытаюсь найти способ проверки путей, переданных в качестве аргументов моей программе, некоторые из которых указывают на файлы FIFO, созданные путем подстановки процессов.
Есть ли способ на языке оболочки (или C++), с помощью которого я могу проверить, создает ли система эти файлы /dev/fd
или они создаются где-то еще?
решение1
Короткий ответ: вы не можете этого сделать. То, что bash по умолчанию помещает пути fifo в каталог, не означает, что конкретный fifo в этом каталоге был создан bash или что он был передан bash в качестве аргумента вашей команде.
Посмотрите на общую картину вашей проблемы. Что вы ДЕЙСТВИТЕЛЬНО пытаетесь решить?
Если вы пытаетесь решить проблему "вывод моей программы всегда должен быть передан в другую программу", то не требуйте от пользователя использовать неясную подстановку процесса bash. А что, если оболочка по умолчанию в их системе - zsh? Bourne shell? Korn shell?
Вместо этого пусть ваша программа создаст канал, ответвит и выполнит другую программу.
Итак, что вы на самом деле пытаетесь сделать? Что произойдет, если вы, не дай бог, запишете свой вывод в файл, переданный пользователем вашей программы, а не в fifo, созданный bash?
решение2
Используйте эту -p
опцию test
, если файл является каналом:
#!/bin/bash
file="$1"
if [ -p "$file" ]
then
echo "$file is a pipe"
fi
Демонстрация:
$ myscript.sh <(echo hello)
/dev/fd/63 is a pipe