【发布时间】:2019-12-15 03:18:17
【问题描述】:
(有人问过这个问题here,但答案是特定于 Linux 的;我在 FreeBSD 和 NetBSD 系统上运行(EDIT:通常)没有/proc。)
Python 似乎使argv[0] 变得笨拙,因此您不会像 C 程序那样得到传递给进程的内容。公平地说,sh、bash 和 Perl 也好不到哪里去。有什么办法可以解决这个问题,所以我的 Python 程序可以获得原始值吗?我在这个 FreeBSD 系统上拥有管理权限,并且可以做一些事情,比如更改每个人的默认 PATH 环境变量以指向包含 python2 和 python3 的目录之前的某个其他目录,但我无法控制创建 /proc。我有一个说明问题的脚本。一、脚本的输出:
the C child program gets it right: arbitrary-arg0 arbitrary-arg1
the python2 program dumbs it down: ['./something2.py', 'arbitrary-arg1']
the python3 program dumbs it down: ['./something3.py', 'arbitrary-arg1']
the sh script dumbs it down: ./shscript.sh arbitrary-arg1
the bash script dumbs it down: ./bashscript.sh arbitrary-arg1
the perl script drops arg0: ./something.pl arbitrary-arg1
...现在是脚本:
#!/bin/sh
set -e
rm -rf work
mkdir work
cd work
cat > childc.c << EOD; cc childc.c -o childc
#include <stdio.h>
int main(int argc,
char **argv
)
{
printf("the C child program gets it right: ");
printf("%s %s\n",argv[0],argv[1]);
}
EOD
cat > something2.py <<EOD; chmod 700 something2.py
#!/usr/bin/env python2
import sys
print "the python2 program dumbs it down:", sys.argv
EOD
cat > something3.py <<EOD; chmod 700 something3.py
#!/usr/bin/env python3
import sys
print("the python3 program dumbs it down:", sys.argv)
EOD
cat > shscript.sh <<EOD; chmod 700 shscript.sh
#!/bin/sh
echo "the sh script dumbs it down:" \$0 \$1
EOD
cat > bashscript.sh <<EOD; chmod 700 bashscript.sh
#!/bin/sh
echo "the bash script dumbs it down:" \$0 \$1
EOD
cat > something.pl <<EOD; chmod 700 something.pl
#!/usr/bin/env perl
print("the perl script drops arg0: \$0 \$ARGV[0]\n")
EOD
cat > launch.c << EOD; cc launch.c -o launch; launch
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,
char **argv,
char **arge)
{
int child_status;
size_t program_index;
pid_t child_pid;
char *program_list[]={"./childc",
"./something2.py",
"./something3.py",
"./shscript.sh",
"./bashscript.sh",
"./something.pl",
NULL
};
char *some_args[]={"arbitrary-arg0","arbitrary-arg1",NULL};
for(program_index=0;
program_list[program_index];
program_index++
)
{
child_pid=fork();
if(child_pid<0)
{
perror("fork()");
exit(1);
}
if(child_pid==0)
{
execve(program_list[program_index],some_args,arge);
perror("execve");
exit(1);
}
wait(&child_status);
}
return 0;
}
EOD
【问题讨论】:
-
只是好奇,它的用例是什么?
-
(a) 我在条目顶部链接的另一个 stackoverflow 项目本身指向一个引发相同问题的非 stackoverflow 项目,并声称 CUPS 实际上使用 argv[0 ] 包含一个 URL! (b) 这很复杂,但我会有一个目录树,其中每个都有同名的 python 程序,每个人都想知道用户是如何到达那里的。
-
这与表现不佳的脚本语言关系不大,而与 shebang 机制及其工作方式有关。一些细节是here。记下底部的表格......在许多情况下,跨操作系统的行为非常不同。 CUPS 的情况很糟糕……你可以看看
DEVICE_URI环境变量吗? -
@JohnSzakmeister:感谢您的链接,最有启发性。是的,这是一件大事(至少);我的答案中的演示脚本显示了如何使用一些脚本语言来克服这个问题,也许其他人可以添加到列表中。 CUPS 的情况很丑陋(我想,这让我原来的问题有点丑陋)。但由于 C 程序可以处理任意 argv[0],因此没有理由不将其扩展到 shebang 情况。我既不维护也不使用 CUPS,但认为 URL 的使用是......可笑的。
标签: python