0

別のコードでテストを実行することになっているコード(1)があります(疑似bash)。このコード (1) は、「ユーザー シミュレーション」の「expect」を使用して記述されています。

問題は、このコード (1) がシステムを実行するときです (この場合、システム "rm totoExpect.txt titiExpect.txt")。

2つのファイルに違いはありません。アクセス許可が同じであっても、うまくいかない理由は考えられません。

問題が発生するコード (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ão foi possível remover "titiExpect.txt": Arquivo ou diretório não 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

最悪の問題は、このコードが変更されるべきではないことですが、これはプログラムのせいで失敗したように思えます。(実際、行にコメントを付けると問題が解決します..)

何か案は?

4

1 に答える 1

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

2 番目sendは、という名前のファイルを生成しますtitiExpect.txt\rcatfile がないため、この部分は実際には失敗しますtotoExpect.txtが、コマンドはパイプの一部であり、パイプ内の最後のコマンドではないため、expect はそれをエラーとしてキャッチしません。(表示されるのは、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により、ファイルの 1 つが存在しなくてもエラーが発生しなくなります。

私の提案は、そのテストを次のように書き直すことです

# 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ます。

于 2012-11-05T03:16:57.853 に答える