系统命令rm在expect程序中不起作用

时间:2012-11-04 21:57:14

标签: c linux bash expect rm

我有一个代码(1)应该在另一个代码中执行测试(它是伪bash)。这段代码(1)是使用“期望”为“用户模拟”编写的。

问题是这个代码(1)执行一个系统(在这种情况下,系统“rm totoExpect.txt titiExpect.txt”)当它刚刚找不到titiExpected.txt时,就在那里!

两个文件之间没有什么不同,即使权限是相同的,我也无法想到一个不起作用的原因。

以下是问题引发的代码(1)的一部分:

# test 5
proc t5 {} {
    send "ls > totoExpect.txt\r"
    send "cat < totoExpect.txt | wc -l > titiExpect.txt\r"
    send "cat titiExpect.txt\r"
    expect -re "(0|1|2|3|4|5|6|7|8|9)+.*>" { ok 5; } default { abort 5 }
    system "rm totoExpect.txt titiExpect.txt"
}

错误信息:

ls > totoExpect.txt
out: totoExpect.txt
seq[0]: 'ls' 
-----3
ensishell>c
 ***** TEST 5 ok

rm: não foi possível remover "titiExpect.txt": Arquivo ou diretório não encontrado
child process exited abnormally
    while executing
"system "rm totoExpect.txt titiExpect.txt""
    (procedure "t5" line 6)
    invoked from within
"t5"
    ("eval" body line 1)
    invoked from within
"eval "t$t;" "
    ("foreach" body line 1)
    invoked from within
"foreach t {0 1 2 3 4 5 6 7} { eval "t$t;" } "
    invoked from within
"expect_user {
    -timeout 30 "auto\n" {
    puts "AUTO:\n";
    foreach t {0 1 2 3 4 5 6 7} { eval "t$t;" } 
    }
    -timeout 30 -re "(\[0123456789 \]+)\..."
    (file "./testshell.expect" line 99)
make: ** [test] Erro 1

“rm:nãofoipotívelremover”titiExpect.txt“:Arquivo oudiretórionãencontrado” 意思是“rm:无法删除”titiExpect.txt“:找不到文件或目录”(对不起......)

这是错误信息之后的ls -l(所以titiExpect.txt不应该在那里):

-rwxrwxr-x   1 fernando       fernando    273 Out 23 17:53 #Makefile#
-rwxrwxr-x   1 fernando       fernando   6238 Nov  5 21:18 #ensishell.c#
-rwxrwxr-x   1 fernando       fernando   1271 Out 24 20:30 #readcmd.h#
-rwxrwxr-x   1 fernando       fernando   3250 Nov  5 21:07 #testshell.expect#
-rwxrwxrwx   1 fernando       fernando    303 Out 24 20:21 Makefile
drwxrwxr-x   2 fernando       fernando   4096 Nov  4 19:06 SEPC shell
-rw-rw-r--   1 fernando       fernando 193453 Out 18 18:25 Sujet_shell.pdf
-rwxrwxr-x   1 fernando       fernando  25451 Nov  5 21:17 ensishell
-rwxrwxrwx   1 fernando       fernando   6238 Nov  5 20:32 ensishell.c
-rw-rw-r--   1 fernando       fernando  10664 Nov  5 21:17 ensishell.o
-rwxrwxr-x   1 fernando       fernando   7251 Nov  4 00:33 foo
-rw-rw-r--   1 fernando       fernando    173 Nov  4 00:33 foo.c
-rw-rw-r--   1 fernando       fernando     16 Nov  4 01:15 in.txt~
-rwxrwxrwx   1 fernando       fernando   6603 Out 23 00:37 readcmd.c
-rwxrwxrwx   1 fernando       fernando   1271 Out 23 01:24 readcmd.h
-rwxrwxrwx   1 fernando       fernando   1271 Out 23 00:37 readcmd.h~
-rw-rw-r--   1 fernando       fernando  11216 Nov  5 21:17 readcmd.o
-rwxrwxrwx   1 fernando       fernando   3250 Nov  5 20:41 testshell.expect
-rwx------   1 fernando       fernando   1263 Nov  5 12:43 toto.txt

最糟糕的问题是这段代码不应该被修改,但在我看来,这是程序故障,这是失败的。 (事实上​​,评论该行解决问题..)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

查找

# test 5
proc t5 {} {
    send "ls > totoExpect.txt\r"
    send "cat < totoExpect.txt | wc -l > titiExpect.txt\r"
    send "cat titiExpect.txt\r"
    expect -re "(0|1|2|3|4|5|6|7|8|9)+.*>" { ok 5; } default { abort 5 }
    system "rm totoExpect.txt titiExpect.txt"
}

第一个send创建一个名为totoExpect.txt\r的文件。

第二个send生成名为titiExpect.txt\r的文件。 cat部分实际上失败了,因为没有文件totoExpect.txt,但由于该命令是管道的一部分,而不是所述管道中的最后一个命令,因此期望不会将其视为错误。 (你只会看到titiExpect.txt\r文件是空的。)

上面的\r是CR角色,可能是你错过它的原因。在Linux中,文件名中完全允许使用字符(因为仅禁止/\0)。只需从测试中删除它,你就会发现它工作正常。

或者,如果你坚持要保留它,那就保持一致:

# test 5
proc t5 {} {
    send "ls > totoExpect.txt\r"
    send "cat < totoExpect.txt\r | wc -l > titiExpect.txt\r"
    send "cat titiExpect.txt\r"
    expect -re "(0|1|2|3|4|5|6|7|8|9)+.*>" { ok 5; } default { abort 5 }
    system "rm totoExpect.txt\r titiExpect.txt\r"
}

最后,在删除文件时,建议使用-f标志,因此如果其中一个文件不存在,rm不会抱怨。

我的建议是将该测试重写为

# test 5
proc t5 {} {
    send "ls > totoExpect.txt"
    send "cat < totoExpect.txt | wc -l > titiExpect.txt"
    send "cat titiExpect.txt"
    expect -re "(0|1|2|3|4|5|6|7|8|9)+.*>" { ok 5; } default { abort 5 }
    system "rm -f totoExpect.txt titiExpect.txt"
}

根除那些不稳定的\r