我有以下 bash 脚本:abc.sh
#!/bin/bash
echo First Arg: $0
echo Second Arg: $1
a=$(ls)
echo Directory contents: $a
我调用以下命令:
/usr/bin/bash -c 'source "$0" && exec "$@" ' /home/usr/rob/abc.sh /home/usr/rob/abc.sh ARG1
根据文档,使用
-c
选项,从给定的字符串中读取命令;如果字符串之外有任何内容,则第一个参数将传递给 $0
。
所以上面的源"$0"
将变成:source /home/usr/rob/abc.sh
。
所以预期的输出是:
First Arg: /home/usr/rob/abc.sh
Second Arg:
Directory contents: abc.txt abc.sh <-- The dir has only these two files
First Arg: /home/usr/rob/abc.sh
Second Arg: ARG1
Directory contents: abc.txt abc.sh
但实际打印的是:
First Arg: /home/usr/rob/abc.sh
Second Arg: /home/usr/rob/abc.sh
Directory contents: abc.txt abc.sh
First Arg: /home/usr/rob/abc.sh
Second Arg: ARG1
Directory contents: abc.txt abc.sh
问题是:当我打印
$0
和$1
时,第一个命令(source /home/usr/rob/abc.sh
)如何打印脚本的名称?对于两个 echo 语句'
理想情况下,
$1
应打印空白;因为我们不传递任何东西作为参数。
同时,
exec
$@ 按预期打印值(对于 $0
和 $1
)。
您假设
source foo
将导致 foo
在没有参数的情况下运行。事实并非如此。
这是
help source
:
如果提供任何参数,它们将在执行 filename 时成为位置参数。否则位置参数不变。
由于
source
命令没有其他参数,位置参数不变,因此 $1
仍然是 /home/usr/rob/abc.sh