Bash 脚本 -c 选项行为

问题描述 投票:0回答:1

我有以下 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
)。

bash
1个回答
0
投票

您假设

source foo
将导致
foo
在没有参数的情况下运行。事实并非如此。

这是

help source

如果提供任何参数,它们将在执行 filename 时成为位置参数。否则位置参数不变。

由于

source
命令没有其他参数,位置参数不变,因此
$1
仍然是
/home/usr/rob/abc.sh

© www.soinside.com 2019 - 2024. All rights reserved.