2017-08-07 13 views
1

我有2个期望的命令,但是,我不明白正在进行的扩展。 (在上下文中,我有一个连接到服务器,下载和空白的所有日志文件在指定的目录中的脚本。)Bash不一致转义星号*在期望?

expect -c " 
    set timeout 1 
    spawn scp [email protected]:/logdir/\*.log . 
    expect yes/no { send yes\n ; exp_continue } 
    expect password: { send $pass\n } 
    expect 100% 
    sleep 1 
    exit 
"; 

在此命令,预计将显示催生命令spawn scp [email protected]:/logdir/*.log .这意味着,在\去掉了。

expect -c " 
    set timeout 1 
    spawn ssh [email protected] {echo '' | tee /logdir/\*.log > /dev/null} 
    expect yes/no { send yes\n ; exp_continue } 
    expect password: { send $pass\n } 
    expect eof 
"; 

在此命令中,期望显示为spawn ssh [email protected] echo '' | tee /logdir/\*.log > /dev/null衍生的命令即开即\是除去。为什么不同? (如果我没有逃过星号,就像tee /logdir/*.log一样,它确实有效,但我不明白与上述情况有什么不同)

+0

答案有帮助解决你的问题吗? – pynexj

+0

哎呀,我忘了这个问题,直到现在。是的,它帮助我解决了我的问题,谢谢! – Eric

回答

3

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

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

根据Tcl doc

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

[...]

反斜杠取代是上在大括号的话不进行,除了反斜杠换行符如上所述。

+0

scp(和sftp rcp rsync)中_remote_文件的Globes不需要通常不能由本地shell处理,它们在远程系统上由对等进程处理。 –

+0

是的,你是对的。回滚我的答案,并删除部分。 – pynexj