2015-11-03 57 views
0

我在SLES 11 SP3上使用GNU bash 3.2.51。在執行source filename時我注意到了一個不尋常的行爲 - 它執行任何處理命令行參數$*的任何事情。

文件f1.sh

#!/bin/bash 
#this is only a test driver 
echo FYI PWD=$PWD 
./f2.sh "$*" 

文件f2.sh

#!/bin/sh 
#this is the application script 
echo args in f2.sh were $* 

文件f3.sh

#!/bin/bash 
#this is the real driver code 
echo FYI PWD=$PWD 
source ~/.bashrc 
./f2.sh "$*" 

當我執行f1.sh cat f2.sh我得到這似乎OK

以下
/tmp> ./f1.sh cat f1.sh 
FYI PWD=/tmp 
args were cat f1.sh 

但是,當我執行f3.sh cat f2.sh我得到的,很意外

/tmp> ./f3.sh cat f1.sh 
cat: f1.sh: No such file or directory 
cat: f1.sh: No such file or directory 
FYI PWD=/usr/app/DB/DB00 
./f3.sh: line 4: ./f2.sh: No such file or directory 

最後我決定修改f3.shshift掉任何剩餘$*值執行source ~/.bashrc

#!/bin/bash 
#this is the real driver code 
echo FYI PWD=$PWD 
cmd="$*" 
while shift; do true; done #<<<<<<<<<<<<<<< get rid of hanging args 
source ~/.bashrc 
./f2.sh ${cmd} 

,但我之前不知道爲什麼這樣工作。也許更有知識的人可以解釋到底發生了什麼。 (也許有一個選項)非常感謝。

+1

可能更適合使用'$ @'代替。 – fedorqui

+3

你的例子沒有顯示'source'使用'$ *',但是'source〜/ .bashrc'確實有很大的不同。檢查你的'〜/ .bashrc'是否可以使用'$ *'。 – bfontaine

+0

你確定採購是在做嗎?採購其他文件是否具有相同的行爲?什麼改變'f3.sh'中的'PWD'?你的'.bashrc'包含什麼?它是否根據位置參數進行操作? –

回答

1

source不使用$*;但是找到另一個腳本在相同的上下文中執行它,並因此使其可用於$*。這裏~/.bashrc可能使用$*[email protected]的腳本參數。

下面是origin.sh一個例子:

#! /bin/bash 
echo "  args before: $*" 
source ./script.sh 
echo "  args after: $*" 

script.sh

#! /bin/bash 
echo "args in the script: $*" 
# shift the list twice 
shift 
shift 

執行./origin.sh所示:

​​3210

這證實script.sh訪問$*,可以使用它並修改它。

現在,如果我改變origin.sh執行script.sh,而不是採購它,它會在另一個shell得到評估,不會有機會獲得origin.sh$*

#! /bin/bash 
echo "  args before: $*" 
./script.sh 
echo "  args after: $*" 

結果:

./origin.sh foo bar qux 
     args before: foo bar qux 
args in the script: 
     args after: foo bar qux 
+0

這是一個很好的解決方法 – Dinesh