Мы можем использовать канал для применяя пароль, и я использовал его, и он отлично работает.
COMMAND = "$ {DIRECTORY} /script.sh"
su -c postgres $ COMMAND | passwd "введите здесь свой пароль"
В (по крайней мере )системах на базе Linux -FIFO или Named Pipe являются однонаправленными. В вашей ситуации вы хотите, чтобы программа читала и писала в один и тот же FIFO. Это становится еще более сложным, потому что вы можете столкнуться с взаимоблокировкой, если превысите внутренний буфер канала.
Два общих момента.
Вы не можете с пользой иметь двух читателей; если вы это сделаете, вы обнаружите, что ваши чтения будут чередоваться недетерминировано, и ваши данные будут разделены между двумя читателями. Вы не получите дубликаты одних и тех же данных для обоих считывателей.
У вас может быть два (или более )модуля записи, но выходные данные снова будут чередоваться в том порядке, в котором они получены конвейером. Если ваши модули записи не будут тщательно синхронизированы, такие данные, как First writer
и Second writer
, могут быть получены как искаженные FirSecond wrstwrititerer
.
Используя программу в нижней части этого ответа, рассмотрите возможность запуска следующих двух сценариев из разных сеансов терминала. Тогда попробуйте свои варианты.
First terminal Second terminal Third terminal
-------------------- -------------------- --------------------
./fifo.sh read ./fifo.sh read ./fifo.sh write /etc/hosts
First terminal Second terminal Third terminal
-------------------- -------------------- --------------------
./fifo.sh write /etc/passwd ps -ef |./fifo.sh write ./fifo.sh read
First terminal Second terminal Third terminal
-------------------- -------------------- --------------------
./fifo.sh both /etc/passwd
Скрипт для fifo.sh
выглядит следующим образом
#!/bin/bash
#
pipe=/tmp/mypipe
########################################################################
# Reader
#
doRead()
{
echo "Reading from pipe $pipe" >&2
nl <"$pipe"
}
########################################################################
# Writer. We pause after every line (for effect)
#
doWrite()
{
[[ $# -eq 0 ]] && set -- -
echo "Writing to pipe $pipe" >&2
cat "$@" | while IFS= read -r line; do printf "%s\n" "$line"; sleep 1; done >>"$pipe"
}
########################################################################
# Reader-Writer. We pause after every line (for effect)
#
doBoth()
{
[[ $# -eq 0 ]] && set -- -
echo "Reading and writing to pipe $pipe" >&2
exec 3<>"$pipe"
nl <&3 & readPID=$!
cat "$@" | while IFS= read -r line; do printf "%s\n" "$line"; sleep 1; done >&3
kill $readPID 2>/dev/null
}
########################################################################
#
action="$1"
shift
if [[ ! -p "$pipe" ]]
then
echo "Creating pipe $pipe" >&2
mkfifo "$pipe"
fi
case "$action" in
read*) doRead "$@" ;;
write*) doWrite "$@" ;;
both) doBoth "$@" ;;
esac