我正在使用RedHat EL 4.我正在使用Bash 3.00.15。
我正在编写SystemVerilog,我想模仿stdin和stdout。我只能将文件用作普通的stdin,并且环境中不支持stdout。我想使用命名管道来模拟stdin和stdout。
我了解如何使用mkpipe创建to_sv和from_sv文件,以及如何在SystemVerilog中打开它们并使用它们。
通过使用“cat> to_sv”,我可以将字符串输出到SystemVerilog模拟。但那也输出了我在shell中输入的内容。
如果可能的话,我想要一个单独的shell,它的行为几乎就像一个UART终端。无论我输入的是什么,都会直接输出到“to_sv”,而写入“from_sv”的内容会被打印出来。
如果我对此完全错误,那么无论如何都要建议正确的方法!非常感谢你,
Nachum Kanovsky
答案 0 :(得分:2)
编辑:您可以输出到命名管道并从同一终端中的另一个管道读取。您还可以使用stty -echo
禁用要回显到终端的密钥。
mkfifo /tmp/from
mkfifo /tmp/to
stty -echo
cat /tmp/from & cat > /tmp/to
使用此命令将您编写的所有内容发送到/tmp/to
并且不会回显,并且会回显写入/tmp/from
的所有内容。
更新:我找到了一种方法,可以将每个字符发送到/ tmp /一次一个。而不是cat > /tmp/to
使用此命令:
while IFS= read -n1 c;
do
if [ -z "$c" ]; then
printf "\n" >> /tmp/to;
fi;
printf "%s" "$c" >> /tmp/to;
done
答案 1 :(得分:0)
您可能希望使用exec
,如下所示:
exec > to_sv
exec < from_sv
请参阅 19.1。和 19.2 部分。在Advanced Bash-Scripting Guide - I/O Redirection
中答案 2 :(得分:0)
而不是cat /tmp/from &
您可以使用tail -f /tmp/from &
(至少在Mac OS X 10.6.7上,如果我echo
不止一次/tmp/from
,这可以防止死锁
基于林奇的代码:
# 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