【发布时间】:2021-09-15 05:12:17
【问题描述】:
对于bash - Detect if a script is being run via shebang or was specified as a command line argument - Unix & Linux Stack Exchange 中描述的问题,我们需要区分脚本是通过shebang 运行的情况和作为解释器的参数的情况。
An answer to that question 建议使用 getauxval(AT_EXECFN) 获取 pre-shebang 可执行文件名称——这可行,但仅适用于 Linux。
由于 Pyenv 项目也正式支持 MacOS,如果我们要考虑该解决方案,我们需要一个等效的。
我已经检查了Finding current executable's path without /proc/self/exe——但_dyld_get_image_name(0) 和_NSGetExecutablePath 都给出了post-shebang 名称。这是我用来检查的示例程序(请参阅上面的问题链接了解它的使用方式;它的编译结果需要代替该问题中给出的python3 Bash 脚本):
#include <stdio.h>
#include <unistd.h>
/*#include <sys/auxv.h>*/
#include <mach-o/dyld.h>
#include <sys/param.h>
#include <alloca.h>
int main(int argc, char** argv) {
//char *at_execfn = (char*)getauxval(AT_EXECFN);
//const char *at_execfn = _dyld_get_image_name(0);
char *at_execfn = (char*)alloca(MAXPATHLEN);
uint32_t at_execfn_len = MAXPATHLEN;
_NSGetExecutablePath(at_execfn,&at_execfn_len);
printf("original executable: '%s'\n",at_execfn);
for(int i=0; i<argc; i++) {
printf("'%s'\n",argv[i]);
}
execvp("python3",argv);
}
【问题讨论】:
-
如果您可以更改脚本,为什么不使用
env调用程序来检测shell 脚本是“调用shebang”还是“加载了解释器”?#!/usr/bin/env -S SHEBANG=1 "shell"shebang 之类的东西? -
@Zilog80 我们无法更改用户 Python 脚本中的 shebangs。请参阅链接的问题。