我有2个期望命令,但是,我不明白正在进行的扩展。 (在上下文中,我有一个连接到服务器的脚本,下载并清空指定目录中的所有日志文件。)
expect -c "
set timeout 1
spawn scp user@hostname:/logdir/\*.log .
expect yes/no { send yes\n ; exp_continue }
expect password: { send $pass\n }
expect 100%
sleep 1
exit
";
在此命令中,expect会将生成的命令显示为spawn scp user@hostname:/logdir/*.log .
,这意味着\ _已被删除。
expect -c "
set timeout 1
spawn ssh user@hostname {echo '' | tee /logdir/\*.log > /dev/null}
expect yes/no { send yes\n ; exp_continue }
expect password: { send $pass\n }
expect eof
";
在此命令中,expect会将生成的命令显示为spawn ssh user@hostname echo '' | tee /logdir/\*.log > /dev/null
,这意味着\ < <\ n>已删除。它为什么不同? (如果我没有像tee /logdir/*.log
那样逃避星号,它确实有用。但是我不明白什么与上述情况不同?)
答案 0 :(得分:3)
这就是Tcl如何处理反斜杠。
[bash] # tclsh
% puts \*
*
% puts "\*"
*
% puts {\*}
\*
%
根据Tcl doc:
如果单词中出现反斜杠(
\
),则会发生反斜杠替换。 除了下面描述的所有情况外,反斜杠都会被删除,并且后面的字符被视为普通字符并包含在单词中。下表列出了特殊处理的反斜杠序列以及值替换每个序列。[...]
如上所述,反斜杠替换不会对大括号中的单词执行,但反斜杠换行符除外。