0

我正在使用 RedHat EL 4。我正在使用 Bash 3.00.15。

我正在编写 SystemVerilog,我想模拟标准输入和标准输出。我只能使用文件,因为环境中不支持普通的标准输入和标准输出。我想使用命名管道来模拟标准输入和标准输出。

我了解如何使用 mkpipe 创建 to_sv 和 from_sv 文件,以及如何在 SystemVerilog 中打开和使用它们。

通过使用“cat > to_sv”,我可以将字符串输出到 SystemVerilog 模拟。但这也会输出我在 shell 中输入的内容。

如果可能的话,我想要一个外壳,它的作用几乎就像一个 UART 终端。我输入的任何内容都会直接输出到“to_sv”,而写入“from_sv”的任何内容都会被打印出来。

如果我完全错了,那么一定要建议正确的方法!太感谢了,

纳楚姆·卡诺夫斯基

4

3 回答 3

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
于 2011-07-07T04:10:06.960 回答
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
于 2011-07-08T19:39:38.510 回答
0

您可能希望使用exec如下:

exec > to_sv
exec < from_sv

请参阅第19.1 节。19.2。在Advanced Bash-Scripting Guide - I/O Redirection

于 2011-07-07T03:45:49.903 回答