2010-07-21 118 views
1

我有一組管道命令可以在命令行上工作,但在腳本中運行時不會產生輸出。Bash命令在cmd行但在腳本中不起作用

的命令是:

STRNG=$(ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}'); echo "$STRNG"` 

,輸出是:

/usr/sbin/smcroute -a eth3 192.0.1.19 224.1.1.1 vtun0 vtun1 
/usr/sbin/smcroute -a eth3 192.0.1.18 224.1.1.1 vtun0 vtun1 

但是,如果我把同樣的命令行成一個劇本,我沒有得到任何來自echo "$STRNG"命令的輸出。

我試圖做的是在執行每$STRNG行一個命令,但是由於各種原因出現$STRNG不包含腳本中的任何文字,而$STRNG確實在命令行運行時包含文本。我相信這是由於對bash的理解有限。

有人可以幫助我嗎?

+0

腳本是什麼樣的?(至少第一行) – Fosco 2010-07-21 19:01:30

+6

嘗試使用-x運行它: /bin/bash -x your_script.sh 它會轉儲調試信息。 – Scharron 2010-07-21 19:03:02

回答

0

我想感謝大家的幫助 - 這些都是未來尋找的好東西。

我的腳本的第一行是命令行不同:

/usr/sbin/smcroute -k; /usr/sbin/smcroute -d

事實證明,我正在從IP不同的結果每次mroute顯示,可能是因爲多播數據包還沒有到來在界面上。在第一行之後和ip mroute show鏈之前添加一個 sleep 1固定它。

如果不是福斯科的幫助,我不會發現它,而且我也不知道如何調試或擴展別名。

0

您的管道中的命令之一是別名嗎?如果是這樣,你需要做的

shopt -s expand_aliases 

爲了慶典,擴大它在腳本....這通常只能由 默認在交互shell啓動。

0

正如Scharron所說,使用sh -x運行它。除此之外:

  • ip在腳本的$ PATH?
  • 您的腳本中是否使用了不同的語言環境($ LANG或$ LC _ ???),所以命令的輸出會被翻譯成另一種語言?
0

我會把它分成小塊來調試它。

即,首先有一個腳本,做這樣的:

ip mroute show 

運行該腳本。如果這產生了輸出,那麼就更多。

ip mroute show | tr -d "()," 

ip mroute show | tr -d "()," | awk ' {print $0 } ' 

ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}' 
相關問題