tech-userlevel archive

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

Re: interactive shell detection in shrc



Valery Ushakov wrote in
 <ZvHZQN0ouO82whAU%snips.stderr.spb.ru@localhost>:
 |On Tue, Sep 24, 2024 at 00:06:22 +0700, Robert Elz wrote:
 |
 |>     Date:        Mon, 23 Sep 2024 12:16:10 +0300
 |>     From:        Valery Ushakov <uwe%stderr.spb.ru@localhost>
 |>     Message-ID:  <ZvEx2vPnDQB8A7vJ%snips.stderr.spb.ru@localhost>
 |> 
 |>| I'd like to switch this to the "early return" style, something like
 |>|
 |>| # the rest of the file is for interactive shells only
 |>| case "$-" in *i*) ;; *) return ;; esac
 |> 
 |> I think the primary motivation for not doing it that way is so
 |> the file can be used as a script ("sh .shrc") for testing.
 |
 |That's kinda moot.  shrc is there to affect the state of a shell in a
 |way that is visible in subsequent use of that same shell.  sh .shrc
 |allows you to check that .shrc has no failures, but you cannot test
 |how it affected the shell (as opposed to sourcing it).  So if the
 |purpose of the sh .shrc excercise is just to check that .shrc can be
 |processed without failure one may almost unironically argue that the
 |return approach is actually better, b/c it will check the
 |interactive-only part too: sh .shrc is a _non_ interactive shell and
 |return in the non-interacive branch is ingored, so shell falls through
 |to the interactive-only part.
 |
 |I would say win-win :)

fwiw i have (in ~/.profile)

  # Some (ksh(1), NetBSD sh(1)) correctly auto-include $ENV, but bash(1) doesn't
  # (unless invoked interactively as sh(1) not bash(1));
  # also, Heirloom sh(1) doesn't know about it at all, so do include it here and
  # let it protect itself against multiple inclusion in the same shell
  ENV="${HOME}/.shrc"
  export ENV
  if [ -f "${ENV}" ]; then
          # Also, for bash(1) to recognize this $ENV when started as $bash not $sh,
          # we need to create a ~/.bashrc symlink!
          if [ -f ./.bashrc ]; then
                  :
          elif [ -L ./.bashrc ] && [ "$(readlink ./.bashrc)" = "${ENV}" ]; then
                  :
          else
                  rm -f ./.bashrc
                  ln -s "${ENV}" ./.bashrc
          fi
          # However, if we know for sure anything is fine, simply skip inclusion
          case ${0} in
          *ksh*|*bosh*)
                  ;;
          *)
                  . "${ENV}"
                  ;;
          esac
  fi

and then (in ~/.shrc)

  eval "___isinc=\$___SHRC$$"
  if [ -z "${___isinc}" ]; then
          eval "___SHRC${$}=YES"
          export ___SHRC${$}
          case ${-} in
          *i*|*m*) # {{{
  ...
          esac
  fi
  unset ___isinc

Loose-loose then. :(

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)


Home | Main Index | Thread Index | Old Index