文件头中 shebang 的用法:是否有任何选项可以在 shebang 中传递多个参数

Nis*_*C M 1 bash namespaces hashbang

我使用不同的命名空间来执行 python 文件。使用 shebang/hashbang 来执行此脚本 (/bin/bash -c )。

面临的问题是 shebang 只接受一个参数。即使我传递多个参数,它也会将其视为单个字符串。

舍邦使用: #!/sbin/ip netns exec tmp <executable>

实验:

  1. 单个可执行文件使用:#!/sbin/ip

    Object " tmp" is unknown, try "ip help".
    
    Run Code Online (Sandbox Code Playgroud)
  2. tmp 中的一个 arg shebang :#!/sbin/ip netns

    $/bin/bash -c  tmp
    Command "tmp" is unknown, try "ip netns help".
    
    Run Code Online (Sandbox Code Playgroud)
  3. tmp 中使用了两个 arg shebang:#!/sbin/ip netns exec

    $/bin/bash -c  tmp
    Object "netns exec" is unknown, try "ip help".
    
    Run Code Online (Sandbox Code Playgroud)
    • 它选择“netns exec”作为单个参数
  4. 使用完整的cmd

    tmp 中使用的 shebang :#!/sbin/ip netns exec global python

    $/bin/bash -c  tmp
    Object "netns exec global python" is unknown, try "ip help".
    
    Run Code Online (Sandbox Code Playgroud)

除了链接文件之外,还有什么方法可以将多个参数传递给 shebang 可执行文件。

dan*_*dan 6

Linux(我相信还有其他操作系统)只在第一个空格处将 shebang 字符串分割一次。所以你只能传递一个参数。

当您这样做时#!/sbin/ip netns exec tmp <executable>ip会看到一个参数字符串:(netns exec tmp <executable>包括空格)。

但 GNUenv添加了-S分割 shebang 参数的选项。它也可以在 FreeBSD 上使用env。但不是 busybox env

因此,如果您使用以下命令启动解释器env -S

#!/usr/bin/env -S command -a -b -c
Run Code Online (Sandbox Code Playgroud)

env将在空白处分割三个参数,并将它们传递给command. env当然是看到单个参数-S command -a -b -c,但它可以解析它。

我对命名空间了解不够,不知道这是否是一个好主意,但它似乎对我有用:

$ sudo ip netns add test
$ sudo ip netns identify
# (empty)

$ cat /tmp/netns-shebang-test
#!/usr/bin/env -S ip netns exec test bash

echo "$BASH_VERSION"
echo "$0"
ip netns identify

$ sudo /tmp/netns-shebang-test
5.1.16(1)-release
/tmp/netns-shebang-test-script
test
Run Code Online (Sandbox Code Playgroud)

我展示的是 bash,但它也适用于类似的 python 脚本。我要重申的是,我对命名空间了解不够,不知道这是否是一个好方法。