Nix-Shell Is Cursed
nix-shell is cursed — kokada

            The other day I had to run a PHP project in my machine. I have no idea how PHP
ecosystem work, I just wanted to get it to run.
The easiest way to get a script to run if you use Nix is to use nix-shell. As
many of you probably know, you can add nix-shell as a shebang in your scripts
to run them as ./script. This was a PHP script so I wanted to do the same.
Easy right?
#!/use/bin/env nix-shell
#!nix-shell -i php -p php83
<?php
declare(strict_types=1);
And:
$ ./index.php
Fatal error: strict_types declaration must be the very first statement in the script in index.php on line 4
So it seems that declare(strict_types=1) needs to be the first line in a PHP
script if used. I removed declare(strict_types=1) and while the script works,
I don't have enough expertise in PHP to know if this would be safe or not.
I decided to try something that initially looked really dumb:
#!/use/bin/env nix-shell
<?php
declare(strict_types=1);
#!nix-shell -i php -p php83
And:
$ ./index.php
Works
Wat? I mean, it is not dumb if it works, but this at least looks cursed.
Eventually I found this
comment in a
Nix issue talking about cases where nix-shell shebang doesn't work. It looks
like the classic case of a bug that becomes a
feature.
Update: after posting this in
Lobte.rs, it seems
someone decided to open a Pull
Request to document this behavior.
Also the equivalent for the new nix
CLI
explicitly documents this behavior:

Note that the #! nix lines don't need to follow after the first line, to
accomodate other interpreters.

        