tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: interactive shell detection in shrc



    Date:        Fri, 27 Sep 2024 13:48:17 -0700
    From:        "Greg A. Woods" <woods%planix.ca@localhost>
    Message-ID:  <m1suHsv-0036s2C@more.local>

  | But that was my point!  "m" is not in $- either!

That's very odd, and not 'j' (the old option letter, in some shells,
that is now 'm') either?

(That is, in a shell which supports job control of course, but still
using one that doesn't would be a strange choice to make.)

The m option is supposed to be able to be turned on and off (unlike 'i'
which isn't required to be able to function that way), so really needs
to be in $- so the script can see its current state.

But any current POSIX compat sh should have 'i' in $- if it is interactive.
That is required.

  | However it seems my own test conflates the condition of being a "login
  | shell" with being "interactive".

I saw, but that's not a bad idea, login shells tend to be interactive!

  | So there's nothing in POSIX about login(1) tacking a leading hyphen on
  | and using that to trigger the shell to become a login shell.

In general no, but that's because POSIX has no real concept of "login".
They assume you're starting in a posix environment with a shell ready
to take your commands - how you get to that point is beyond the scope.

But there hasn't been a shell created (since way before 7th edition)
where the **argv == '-' method won't detect a (genuine) login shell.
That's universal.   The "(genuine)" is because some shells (incl ours)
now have other ways to be treated as a login shell (but one invoked
in such a way wouldn't necessarily be interactive, whereas one made
a login shell via the '-' in argv[0] will almost always be.)

  | Indeed from what I can tell POSIX has nothing whatsoever to say about
  | "login shells" nor /etc/profile or $HOME/.profile.

That's mostly right, but I think (at least in Issue 8) there is something
somewhere in some (non-normative) rationale about this.

  | I guess to be entirely POSIX compatible my test should include:
  |
  | 	tty >/dev/null 2>&1 && tty <&1 >/dev/null 2>&1 &&

The second of those would need to be testing (the pre-redirected)
stderr, not stdout, interactive shells don't care where stdout has
been sent (though the user probably does).

But as Steffen (kind of) indicated, "test -t 0 && test -t 2" is
probably an easier way than using tty.

kre



Home | Main Index | Thread Index | Old Index