MacOS:使用绝对路径的 Shebang 不起作用
MacOS: Shebang with absolute path not working
使用 shebang 选择 Python 解释器在某些情况下似乎不起作用。
我正在尝试在 MacOS 上的 shebang (#!/...
) 中使用我的 python3.9 解释器。请参阅下面名为 hello.py
:
的 Python 文件
#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
print("Hello world")
现在,我将确保此文件可执行,并尝试执行它:
$ chmod +x ./hello.py
$ ./hello.py
./hello.py: line 2: syntax error near unexpected token `"Hello world"'
./hello.py: line 2: `print("Hello world")'
这很奇怪。我打错了什么吗?让我尝试直接用我的解释器执行它,看看它是否有效:
$ /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9 ./hello.py
Hello world
这似乎工作正常。为什么 shebang 失败了?让我试试不同的解释器:
#!/usr/bin/python3
print("Hello world")
$ ./hello.py
Hello world
现在可以了吗?很有意思。
问题:
- 为什么 /nix/store-path 在 shebang 中似乎不起作用?
- MacOS 上的 shebang 表达式是否有一些我不知道的限制?例如最大长度,或某些不允许的字符,如
.
或 -
?
我的系统:
- MacOS Big Sur 11.2.1 (20D74)
bash --version
:GNU bash,版本 4.4.23(1)-release (x86_64-apple-darwin17.7.0)
编辑:从 zsh 执行 ./hello.py
而不是 bash 实际上有效(使用 nix-shebang 时)。所以这可能暗示这是 bash.
特有的问题
MacOS 不支持指向脚本的 shebangs -- 这会导致 Exec 格式错误。
bash 和 zsh 都尝试解决 execve()
失败,并取得了不同程度的成功。然而,更好的解决方法是使用上游 nixpkgs 的能力——正如 https://github.com/NixOS/nixpkgs/pull/93757 中介绍的那样——生成一个不会触发错误的包装器。
这个包装器不会看起来像:
#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
...但看起来更像:
#!/nix/store/74shlfgb18717ixjlpivpxd7iqcyhyn5-bash-4.4-p23/bin/bash /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
...有些令人惊讶的是,它按预期工作。
使用 shebang 选择 Python 解释器在某些情况下似乎不起作用。
我正在尝试在 MacOS 上的 shebang (#!/...
) 中使用我的 python3.9 解释器。请参阅下面名为 hello.py
:
#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
print("Hello world")
现在,我将确保此文件可执行,并尝试执行它:
$ chmod +x ./hello.py
$ ./hello.py
./hello.py: line 2: syntax error near unexpected token `"Hello world"'
./hello.py: line 2: `print("Hello world")'
这很奇怪。我打错了什么吗?让我尝试直接用我的解释器执行它,看看它是否有效:
$ /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9 ./hello.py
Hello world
这似乎工作正常。为什么 shebang 失败了?让我试试不同的解释器:
#!/usr/bin/python3
print("Hello world")
$ ./hello.py
Hello world
现在可以了吗?很有意思。
问题:
- 为什么 /nix/store-path 在 shebang 中似乎不起作用?
- MacOS 上的 shebang 表达式是否有一些我不知道的限制?例如最大长度,或某些不允许的字符,如
.
或-
?
我的系统:
- MacOS Big Sur 11.2.1 (20D74)
bash --version
:GNU bash,版本 4.4.23(1)-release (x86_64-apple-darwin17.7.0)
编辑:从 zsh 执行 ./hello.py
而不是 bash 实际上有效(使用 nix-shebang 时)。所以这可能暗示这是 bash.
MacOS 不支持指向脚本的 shebangs -- 这会导致 Exec 格式错误。
bash 和 zsh 都尝试解决 execve()
失败,并取得了不同程度的成功。然而,更好的解决方法是使用上游 nixpkgs 的能力——正如 https://github.com/NixOS/nixpkgs/pull/93757 中介绍的那样——生成一个不会触发错误的包装器。
这个包装器不会看起来像:
#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
...但看起来更像:
#!/nix/store/74shlfgb18717ixjlpivpxd7iqcyhyn5-bash-4.4-p23/bin/bash /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
...有些令人惊讶的是,它按预期工作。