Bash不一致逃避星号*的期待?

时间:2017-08-07 02:14:50

标签: bash tcl expect

我有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那样逃避星号,它确实有用。但是我不明白什么与上述情况不同?)

1 个答案:

答案 0 :(得分:3)

这就是Tcl如何处理反斜杠。

[bash] # tclsh
% puts \*
*
% puts "\*"
*
% puts {\*}
\*
%

根据Tcl doc

  

如果单词中出现反斜杠(\),则会发生反斜杠替换。 除了下面描述的所有情况外,反斜杠都会被删除,并且后面的字符被视为普通字符并包含在单词中。下表列出了特殊处理的反斜杠序列以及值替换每个序列。

     

[...]

     

如上所述,反斜杠替换不会对大括号中的单词执行,但反斜杠换行符除外。