2017-02-13 202 views
0

爲什麼,如果我給那些命令行:IP地址

ip rule add from 10.222.192.0/25 table pdl 
    ip route add 10.104.44.0/24 via 10.222.193.17 table pdl 

一切正常, 而如果我執行這個腳本:

#!/bin/sh 

IPRULEADD=$(/sbin/ip rule add) 
IPROUTEADD=$(/sbin/ip route add) 

# 
# 

#----------- pdl --------------------------- 
echo 100 pdl >> /etc/iproute2/rt_tables 

$IPRULEADD from 10.222.192.0/25 table pdl 
$IPROUTEADD 10.104.44.0/24 via 10.222.193.17 table pdl 

我得到這個錯誤:

from: can't read /var/mail/10.222.192.0/25

謝謝

+0

嘗試添加'回聲「$ IPRULEADD」'等你設置這些變量後。祝你好運。 – shellter

回答

0

$(...)不存儲代碼將在後面執行的;它會生成所附代碼的結果

你想要shell函數。

ip_rule_add() { 
    /sbin/ip rule add "[email protected]" 
} 

ip_route_add() { 
    /sbin/ip route add "[email protected]" 
} 

ip_rule_add from 10.222.192.0/25 table pdl 
ip_route_add 10.104.44.0/24 via 10.222.193.17 table pdl 
你傳遞給函數的參數無論是

正確添加到/sbin/ip"[email protected]"符號參數列表。

+0

謝謝! 第一個答案是最簡單的,我就是我想要做的。 你是最技術最有趣的。 你能解釋一下爲什麼我不應該使用IPRULEADD =「/ sbin/ip rule add」格式嗎? – Step

+0

當你展開'IPRULEADD'時,這個值首先是分詞,然後是路徑名擴展。在你目前的情況下,沒有什麼區別。但考慮一下'FOO ='echo'9 3'*''。如果展開'$ FOO',則首先應用分詞來獲得4個不同的單詞('echo',''9','3'' ,'*'),所以'echo'已經有一個比你想象的更多的參數,接下來,路徑名擴展會將'*'擴展到當前目錄中所有文件的列表(如果沒有文件, '或者按字面處理或者消失,這取決於實際的shell選項。) – chepner

+0

我對bash有點新,所以它不是很清楚,但謝謝 – Step

0

不要使用subhells在變量中存儲字符串。

IPRULEADD="/sbin/ip rule add" 
IPROUTEADD="/sbin/ip route add" 
+0

參數是存儲代碼的錯誤抽象。一般來說,分詞和路徑名擴展會產生除了預期的命令和參數以外的內容。 – chepner