上下文:我读到了这个用shebang可以做的诡计的例子。它使用
#!/bin/rm
它最终删除了您执行的文件(非常有趣;您可以扩展它来创建自删除消息(。这表明程序(rm
(是以文件名为参数调用的,因此可以访问整个文件,包括调用它的shebang
我想出的另一个技巧是在shebang中调用自己作为解释器来创建一个无限循环。例如,如果/usr/bin/loop
以开头
#!/usr/bin/loop
t应该永远自我唤起。显然,在某个时刻会发生错误,在我的特定情况下,我得到:
bash: /usr/bin/loop: /usr/bin/loop: bad interpreter: Too many levels of symbolic links
它看起来有两层深。有人能向我解释一下为什么会出现这种特殊的错误吗?或者可能会为不同的shell共享一些其他错误消息。
我特别想了解为什么会涉及符号链接,以及这是否是bash的实现细节。
为什么会出现这种特殊错误?
因为当内核尝试运行可执行文件时,尝试运行/usr/bin/loop
,然后尝试运行/usr/bin/loop
,然后尝试执行/usr/bin/loop
,等等,最后以ELOOP
错误失败。它检查了这一点。
https://elixir.bootlin.com/linux/latest/source/fs/exec.c#L1767
为不同的shell共享一些其他错误消息。
虽然可能,但这个特定的errno消息来自glibcstrerror
。
为什么有符号链接涉及
因为ELOOP
通常在执行输入/输出操作时返回,所以消息中会提到它们。不涉及符号链接。
这是否是bash的实现细节。
不是。