From: "Austin S. Hemmelgarn" <ahferroin7@gmail.com>
To: Boris <ribalkin@gmail.com>
Cc: Nicolai Stange <nicstange@gmail.com>, linux-kernel@vger.kernel.org
Subject: Re: script relative shebang
Date: Wed, 1 Jun 2016 11:38:59 -0400 [thread overview]
Message-ID: <9d6adc59-3893-18f9-c003-c54a1db9e3cc@gmail.com> (raw)
In-Reply-To: <1A095838-A4DA-4215-8AB7-6ACC92802F0D@gmail.com>
On 2016-06-01 04:00, Boris wrote:
> Hi Nicolai,
>
> Yes, I think this is too ugly:
>
> #!/usr/bin/gawk {exit system("/bin/sh -c 'exec \"$(dirname \"$0\")\"/subdir/catself \"$0\"' " FILENAME);}
>
> Imagine you have that feature in your kernel would you rather use:
>
> #!{dirname}/subdir/catself
The problem with using a keyword is that current VFS standards on Linux
mean that most filesystems that are native to Linux support _any_
character in a path name component except for a null byte. Because of
that, you can't from a practical perspective choose a keyword that is
guaranteed to not clash with any path name, unless you want a 256
character long keyword (which would be worse than the current option).
>
> You second advice involves changing root fs which is not desirable in copy-deployment apps (bring all the dependencies)
Not necessarily, include the wrapper in the app itself. It's not hard
even in shell script to figure out where you're being run from, so it's
really not all that hard to handle this.
In bash, you can do the following in a script to get the canonical path
to you're script (in an interactive shell, it will just point you at the
bash executable):
SELF=$_
SELF=$(realpath ${SELF})
This only works if it's done at the top level of a script (not within a
function).
If you go with the wrapper option, you can find your canonical path name
in /proc/self/exe (note that this won't work right when doing something
like `readlink /proc/self/exe` from an interpreter, as that will return
the path to readlink), or just look up your PID and check /proc/PID/exe.
Also, the convention for such things on most UNIX like systems is to
install wrappers, often using symlinks, in some location that is listed
in $PATH. For example, on many Linux systems, Dropbox gets installed
into /opt/dropbox, and then a link for it is created in /opt/bin to
point at the core program itself. If it's a GUI only app, you could
also just use .desktop files to point at the tools instead of symlinks,
Google Chrome does this for example.
Using the bash example above, the following snippet could be used as a
wrapper by placing it the top level directory of the above example and
then symlinking to it from somewhere in $PATH:
#!/bin/bash
SELF=$_
SOURCE=$(dirname $(realpath ${SELF}))
exec ${SOURCE}/subdir/catself $@
You could then use that script as your interpreter.
next prev parent reply other threads:[~2016-06-01 15:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-31 21:47 script relative shebang Boris Rybalkin
2016-05-31 23:02 ` Nicolai Stange
2016-06-01 8:00 ` Boris
2016-06-01 12:12 ` Bernd Petrovitsch
2016-06-01 15:38 ` Austin S. Hemmelgarn [this message]
2016-06-02 0:04 ` Boris Rybalkin
2016-06-02 4:19 ` Ken Moffat
2016-06-02 22:41 ` Boris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9d6adc59-3893-18f9-c003-c54a1db9e3cc@gmail.com \
--to=ahferroin7@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nicstange@gmail.com \
--cc=ribalkin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).