为什么使用命令 `./myFile a` `a` 被解释为输入参数?

为什么使用命令 `./myFile a` `a` 被解释为输入参数?

用编译程序后,g++ -o myFile myFile.cpp我用来./myFile &执行该程序。

当使用“&”符号时,我知道该程序正在后台执行。

有人能给我指出正确的链接并解释一下是什么./myFile a意思吗?我不明白为什么使用该命令a会被解释为输入参数。

答案1

再次阅读你的问题后我想我明白你在问什么。

您在命令提示符中输入的任何内容都会由底层 shell 解释(如果您没有更改它,则是 Bash)。

Bash 在实际运行命令之前会经过多个步骤:

当 shell 读取输入时,它会执行一系列操作。如果输入指示注释的开始,shell 将忽略注释符号(“#”)以及该行的其余部分。

否则,粗略地说,shell 读取其输入并将输入分为单词和操作符,使用引用规则来选择为各个单词和字符分配哪些含义。

然后,shell 将这些标记解析为命令和其他构造,删除某些单词或字符的特殊含义,扩展其他单词或字符,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使该退出状态可用于进一步检查或处理。

命令右边左边的内容由 中包含的任意分隔符序列分隔$IFS,通常是,在Bash 完成上述步骤后,将被解释为程序的参数:从技术角度来说,这意味着每个标记都可供程序使用,程序可以按照自己想要的方式使用它。\t\n

更具体地说,每个令牌都作为参数传递给execve()系统调用,系统调用启动程序,并通过以下方式供程序使用:argv(指向字符的指针,通常包含在的声明/定义中main()),程序可以访问该指针以检索参数。

答案2

shell 处理这些参数。

这将阻止 shell 执行此操作:

./myFile '&'

因此,程序将获取 & 作为参数。

其他例子:

./myFile *

它会将星号扩展为整个参数列表——当前目录中文件的文件名。

相关内容