【发布时间】:2021-10-13 20:35:09
【问题描述】:
如果你有一个以这样的 shebang 开头的脚本
#!/bin/sh
echo argv0 is $0
或者这个
#!/usr/bin/env python3
import sys
print(f"argv0 is {sys.argv[0]}")
然后您使用自定义 argv[0] 运行它,例如像这样(在 Python 中)
subprocess.run(["fake_argv0"], executable="./real_script")
然后由于某种原因它实际上会打印这个:
argv0 is ./real_script
为什么会发生这种情况?有什么办法可以解决这个问题,或者通过更改脚本的运行方式(subprocess.run() 调用)或更改脚本本身中的#! 行?
【问题讨论】:
-
是
executable改变了argv0的值,而不是命令列表。您的第二个 Python 命令相当于subprocess.run(["./real_script", "fake_argv0"])。 -
据我所知,POSIX shell 不提供为
$0指定替代值的方法。在bash中,您可以使用-a参数到exec来指定不同的名称。我也不知道subprocess可以改变正在执行的程序的值。 -
不,不是。第一个参数是要传递给子进程的
argv。executable指定要运行的实际命令,它只是默认为argv[0]。 -
subprocess.run()确实 更改argv[0]成功。我用 C 程序对其进行了测试。但是由于某种原因,如果目标是#!脚本而不是 ELF 可执行文件,那么它就会出错。 -
@Timmmm POSIX says运行
/bin/sh command_file时,“特殊参数0(见特殊参数)应设置为command_file的值”