Shell 如何在tcl脚本中使用rmt命令?(k)

Shell 如何在tcl脚本中使用rmt命令?(k),shell,tcl,expect,Shell,Tcl,Expect,我正在尝试创建一个使用Expectk和rmt命令的tcl脚本。我可以生成一个rmt进程并获得正确的进程ID,但我使用的send命令都不起作用。我从手册页上注意到,普通send命令是为不同的目的定义的,因此我应该使用exp_send 这是剧本。我只想获取磁带机的状态: #!/bin/sh # Restarts using wish in the command search path exec expectk "$0" -- "$@" set stored_id [spawn "rmt"] ex

我正在尝试创建一个使用Expectk和rmt命令的tcl脚本。我可以生成一个rmt进程并获得正确的进程ID,但我使用的send命令都不起作用。我从手册页上注意到,普通send命令是为不同的目的定义的,因此我应该使用exp_send

这是剧本。我只想获取磁带机的状态:

#!/bin/sh
# Restarts using wish in the command search path
exec expectk "$0" -- "$@"

set stored_id [spawn "rmt"]
exp_send -i $stored_id "O/dev/nst0\r"
exp_send -i $stored_id "S\r"
编辑:这是通常从命令行使用命令的方式:

$ rmt
O/dev/nst0
S
A0
^C

“A0”是命令的响应,^C按Ctrl-C退出rmt命令。

在每个命令结束时尝试发送
\n\r
。以下类型对我适用(注意,使用原始
expect
):


@亚历山大·贝利科夫让我走上了正确的道路

一开始我根本不理解这个命令的手册页。下面的代码似乎可以打开设备进行读写,并获取设备的状态。状态将自动显示在屏幕上,但“获取状态”部分仅表示命令已成功执行

#!/bin/sh
# Restarts using wish in the command search path
exec expectk "$0" -- "$@"

spawn "rmt"
exp_send "O/dev/nst0\r"
exp_send "O_RDRW\r"
expect "A0" {
    puts "Success!"
}

exp_send "S\r"
expect "A" {
    puts "Got the status"
}

我建议两件事:1。将脚本中的
rmt
命令替换为
cat
,并验证该命令是否有效。2.查看直接将数据传输到
rmt
是否有效。使用
autoexpect
然后手工制作生成的脚本可能会更好。@alexander.Belikoff如何在脚本中使用
cat
?我无法将数据导入
rmt
并使其正常工作。我尝试了以下操作:
echo“O/dev/nst0”| echo“S”| rmt
,但命令返回了一个错误。该命令至少执行了,但执行不正确。当它应该返回
A0
时,它返回
E9坏文件描述符@glennjackman我试着使用
autoexpect
,它确实生成了一个脚本,但是我也遇到了同样的问题,
rmt
被生成,然后它就像等待输入一样挂起。结果证明我没有看到输出,因为我没有
expect
语句来表示
A0
,显然是因为我使用了
-I
部分。我将把我的完整脚本作为编辑放在我的问题中,但是你的代码在这里引导我找到了它,所以我将接受你的。谢谢我决定用我自己的答案,把它从问题中排除。我不确定我是否走对了这条路,所以请让我知道。
#!/bin/sh
# Restarts using wish in the command search path
exec expectk "$0" -- "$@"

spawn "rmt"
exp_send "O/dev/nst0\r"
exp_send "O_RDRW\r"
expect "A0" {
    puts "Success!"
}

exp_send "S\r"
expect "A" {
    puts "Got the status"
}