解析/bin/bash -c "$(curl ...)"命令中$与括号的语法作用
关于Homebrew安装命令的两个核心疑问解答
一、$(...)结构的具体用途
$(...)是bash中的命令替换语法,核心作用是:先执行括号内部的命令,将该命令输出的内容,直接替换掉整个$(...)所在的位置。
以Homebrew的安装命令为例:
括号内的curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh,作用是从指定URL下载Homebrew安装脚本的文本内容,并将内容输出到终端。而$(...)会抓取这个输出的文本,把它填充到bash -c ""的引号中,相当于让bash直接执行刚下载到的脚本代码,省去了先把脚本保存为本地文件再运行的步骤。
二、bash -c手册说明的通俗解释
手册原文‘如果存在-c选项,则从字符串读取命令。如果字符串后有参数,它们将被分配给位置参数,从$0开始。’可以拆解成两层意思:
- 第一层:当使用
bash -c "xxx"时,bash不会进入交互模式等待输入,而是直接把引号包裹的xxx当作要执行的命令/脚本代码来运行,这和你理解的“把xxx当作终端输入的命令执行”是一致的。 - 第二层:如果
bash -c "xxx"后面还跟着额外内容,比如执行bash -c "echo $0 $1" test arg1,那么这些后续内容会被分配给脚本内的位置参数变量:$0会被设置为test(注意这里$0不是第一个传入的参数,而是用来模拟脚本名称的占位符)$1会被设置为arg1- 后续更多参数会依次对应
$2、$3等变量
回到Homebrew的安装命令,因为bash -c后面没有额外参数,所以这部分特性暂时用不到,但在编写复杂的脚本调用时,这个参数分配规则会很有用。
内容的提问来源于stack exchange,提问作者LadyofLA
相关产品推荐
相关产品推荐

