Estou usando o RedHat EL 4. Estou usando o Bash 3.00.15.
Estou escrevendo SystemVerilog e quero emularstdin e stdout. Só posso usar arquivos porque o stdin normal e o stdout não são suportados no ambiente. Eu gostaria de usar pipes nomeados para emular stdin e stdout.
Eu entendo como criar um arquivo to_sv e from_sv usando o mkpipe e como abri-los e usá-los no SystemVerilog.
Ao usar "cat> to_sv", posso enviar seqüências de caracteres para a simulação SystemVerilog. Mas isso também gera o que estou digitando no shell.
Gostaria, se possível, de um único shell em que atue quase como um terminal UART. Tudo o que eu digito sai diretamente para "to_sv" e o que quer que seja escrito para "from_sv" é impresso.
Se eu estou lidando com isso completamente errado, sugiro de todos os modos o caminho correto! Muito obrigado,
Nachum Kanovsky
Respostas:
2 para resposta № 1Editar: Você pode enviar para um pipe nomeado e ler de outro no mesmo terminal. Você também pode desativar as teclas para ecoar no terminal usando stty -echo
.
mkfifo /tmp/from
mkfifo /tmp/to
stty -echo
cat /tmp/from & cat > /tmp/to
Whit este comando tudo o que você escreve vai para /tmp/to
e não é ecoado e tudo escrito para /tmp/from
será ecoado.
Atualizar: Encontrei uma maneira de enviar todos os caracteres inseridos no / tmp / para um de cada vez. Ao invés de cat > /tmp/to
use este comando:
while IFS= read -n1 c;
do
if [ -z "$c" ]; then
printf "n" >> /tmp/to;
fi;
printf "%s" "$c" >> /tmp/to;
done
0 para resposta № 2
Você provavelmente quer usar exec
como em:
exec > to_sv
exec < from_sv
Ver secções 19.1. e 19.2. no Guia Avançado de Script Bash - Redirecionamento de E / S
0 para resposta № 3
Ao invés de cat /tmp/from &
você pode usar tail -f /tmp/from &
(pelo menos aqui no Mac OS X 10.6.7, isso impedia um impasse se eu echo
mais de uma vez para /tmp/from
).
Com base no código de Lynch:
# terminal window 1
(
rm -f /tmp/from /tmp/to
mkfifo /tmp/from
mkfifo /tmp/to
stty -echo
#cat -u /tmp/from &
tail -f /tmp/from &
bgpid=$!
trap "kill -TERM ${bgpid}; stty echo; exit" 1 2 3 13 15
while IFS= read -n1 c;
do
if [ -z "$c" ]; then
printf "n" >> /tmp/to
fi;
printf "%s" "$c" >> /tmp/to
done
)
# terminal window 2
(
tail -f /tmp/to &
bgpid=$!
trap "kill -TERM ${bgpid}; stty echo; exit" 1 2 3 13 15
wait
)
# terminal window 3
echo "hello from /tmp/from" > /tmp/from