2013-03-04 85 views
1

探索期待第219頁:此聲明對於期望或bash意味着什麼?

#!/bin/bash 
set kludge { ${1+"[email protected]"} 
shift 
shift 
exec expect -f $0 ${1+"[email protected]"} 
} 
# rest of script follows 

我能夠這樣的bash解釋器中執行我期待的腳本,連我都 傳遞命令行參數,如: ./scriptname arg1 arg2 arg3等 但是當我試圖 sh -x ./scriptname arg1 arg2 arg3它拋出一些錯誤。 請澄清上述聲明和它真正幫助把預期中使用bash

回答

1

腳本看着它期望從第一,這是很簡單的。當給定2個參數時,set命令設置變量的值。這裏的變量名稱是kludge,值是{braces}之間的多行字符串。請注意,在Tcl(和Expect)大括號中禁止擴展(變量替換,命令擴展等),就像單引號在shell中一樣。假設從未使用變量kludge,這是一個完全無害的陳述。

從外殼有點棘手。這個上下文中的shell命令set將設置位置參數。此命令後:

$1 = "kludge" 
$2 = "{" 
$3, $4, ... <= will be the original command line parameters 

再就是2個shift命令彈出"kludge""{"關的參數「棧」,恢復原始位置參數。然後exec命令將啓動expect,替換當前正在運行的shell進程。 如果未使用exec,預計將運行和(大概)終止,然後外殼將上下一行報告語法錯誤:}

總的來說,這是發動期望程序過於聰明的辦法。

#!/bin/bash 
do whatever shell initialization required 
expect -c << 'END_OF_EXPECT' 
# rest of expect script follows 
# ... 
END_OF_EXPECT 

要通過選擇在這種情況下:「劇本#其餘遵循」以

#!/usr/bin/expect -f 

或者,如果有更多的東西在外殼部分發生,用此之前更換一切

expect - "[email protected]" << 'END_OF_EXPECT' 
# ... 

單個-告訴我們期望命令會出現在stdin上。

+0

感謝@glenn了明確的答案你提到的secoand計算策略是好的,但我可以通過positonal參數期望在這種情況下,腳本考慮到它不與的bash腳本謝爾參數衝突......我的意思是我可以做一些事情像這樣expect -c parameter1 parameter2 <<'EOF'EOF – munish 2013-03-05 06:31:50

+0

@munish,答案已更新。 – 2013-03-05 10:20:25