[Libguestfs] Shebang sh plugins

Eric Blake eblake at redhat.com
Mon Nov 25 23:31:44 UTC 2019


On 11/23/19 9:46 AM, Richard W.M. Jones wrote:

> I think an aim of nbdkit is to make it as widely usable as possible.
> That's for example why we have apparent esoterica like plugins written
> in shell script.
> 
> We want to in the future ship the (or "an") imageio plugin separately
> from virt-v2v.  A possibility is it might be shipped as a single
> Python file which starts with ‘#!/usr/bin/env nbdkit python’ which

That is not portable; not all kernels permit more than one argument in 
#!.  You can work around it with modern env (both BSD and Coreutils have 
recently added -S), as:

#!/usr/bin/env -S nbdkit python

which will then invoke the desired 'nbdkit' 'python' 'file' regardless 
of whether the OS invoked 'env' '-S nbdkit python' (Linux) or 'env' '-S' 
'nbdkit' 'python' (others).  But that in turn assumes env -S is portable 
(it's fairly new, so not yet).  Otherwise, interpreted plugin shebangs 
really do have to hard-code the expected path of nbdkit rather than 
relying on env, unless we find a way to make:

nbdkit file

determine that when 'nbdkit-plugin-file.so' does not exist but 'file' 
does, then inspect file to determine if 'nbdkit-plugin-interpreter.so' 
exists based on the first line of file.

Except that would mean the first line changes to:

#!/usr/bin/env nbdkit

which lacks the desired interpreter, so we'd still have to add something 
like documenting that if the first line of the #! contains 'nbdkit', 
then the second line is some form of magic comment that includes the 
substring 'PLUGIN=...' (we have to allow arbitrary slop as prefix or 
suffix after a plugin name, to allow the second line to be a comment or 
otherwise innocuous interpreted line in whatever desired target 
language), so we end up with:

#!/usr/bin/env nbdkit
# PLUGIN=python

where the initial invocation of '/usr/bin/env' 'nbdkit' 'file'
then passes on to '/path/to/nbdkit' 'file'
which sees that 'file' is not a plugin, but does have magic, so it then 
retries as if invoked as '/path/to/nbdkit' 'python' 'file'

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list