我在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.sh
到shift
掉任何剩余$*
值执行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}
,但我之前不知道为什么这样工作。也许更有知识的人可以解释到底发生了什么。 (也许有一个选项)非常感谢。
可能更适合使用'$ @'代替。 – fedorqui
你的例子没有显示'source'使用'$ *',但是'source〜/ .bashrc'确实有很大的不同。检查你的'〜/ .bashrc'是否可以使用'$ *'。 – bfontaine
你确定采购是在做吗?采购其他文件是否具有相同的行为?什么改变'f3.sh'中的'PWD'?你的'.bashrc'包含什么?它是否根据位置参数进行操作? –