gpt4 book ai didi

linux - 为什么 bash 源命令执行 $* 中的任何剩余参数

转载 作者:太空宇宙 更新时间:2023-11-04 10:44:54 24 4
gpt4 key购买 nike

我在 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 时,我得到以下内容,看起来不错

/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 以在执行 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}

但我不知道为什么会这样。也许更有知识的人可以准确解释发生了什么。 (也许有一个选项)非常感谢。

最佳答案

source 不使用 $*;但是采购另一个脚本会在相同的上下文中执行它,从而使 $* 可用于它。这里的 ~/.bashrc 可能使用带有 $*$@ 的脚本参数。

这是一个使用 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 显示:

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

这确认 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

关于linux - 为什么 bash 源命令执行 $* 中的任何剩余参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33501651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com