Nis*_*C M 1 bash namespaces hashbang
我使用不同的命名空间来执行 python 文件。使用 shebang/hashbang 来执行此脚本 (/bin/bash -c )。
面临的问题是 shebang 只接受一个参数。即使我传递多个参数,它也会将其视为单个字符串。
舍邦使用:
#!/sbin/ip netns exec tmp <executable>
实验:
单个可执行文件使用:#!/sbin/ip
Object " tmp" is unknown, try "ip help".
Run Code Online (Sandbox Code Playgroud)
tmp 中的一个 arg shebang :#!/sbin/ip netns
$/bin/bash -c tmp
Command "tmp" is unknown, try "ip netns help".
Run Code Online (Sandbox Code Playgroud)
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)
使用完整的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 可执行文件。
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 脚本。我要重申的是,我对命名空间了解不够,不知道这是否是一个好方法。