diff mbox series

[OpenWrt-Devel] base-files: Add /etc/shinit for non-login shell init

Message ID 20190502182427.6400-1-jeffery.to@gmail.com
State Accepted
Delegated to: Petr Štetiar
Headers show
Series [OpenWrt-Devel] base-files: Add /etc/shinit for non-login shell init | expand

Commit Message

Jeffery To May 2, 2019, 6:24 p.m. UTC
Because /etc/profile (and ~/.profile) are read by login shells only,
aliases and functions defined there are not available to non-login
shells, e.g. when using screen or tmux.

If the ENV environment variable exists (exported by /etc/profile or
~/.profile) and references an existing file, then all interactive shells
(login or non-login) will read that file as well.

This sets the ENV environment variable in /etc/profile, pointing to
/etc/shinit.

This also adds /etc/shinit, which:

* Contains alias and function definitions originally in /etc/profile

* Sources /etc/mkshrc if the user is using mksh (also originally in
  /etc/profile), as /etc/mkshrc is meant for all interactive shells

* Sources ~/.mkshrc if the user is using mksh, to compensate for the
  fact that mksh will not read ~/.mkshrc if ENV is set

* Sources ~/.shinit if the user is not using mksh

This also removes the shebang from /etc/profile, as the file is sourced,
not executed.

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
---
 package/base-files/Makefile                   |  1 +
 package/base-files/files/etc/profile          | 21 +------------------
 package/base-files/files/etc/shinit           | 21 +++++++++++++++++++
 .../lib/upgrade/keep.d/base-files-essential   |  1 +
 4 files changed, 24 insertions(+), 20 deletions(-)
 create mode 100644 package/base-files/files/etc/shinit

Comments

Petr Štetiar April 25, 2020, 11:37 a.m. UTC | #1
Jeffery To <jeffery.to@gmail.com> [2019-05-03 02:24:27]:

Hi,

> Because /etc/profile (and ~/.profile) are read by login shells only,
> aliases and functions defined there are not available to non-login
> shells, e.g. when using screen or tmux.
> 
> If the ENV environment variable exists (exported by /etc/profile or
> ~/.profile) and references an existing file, then all interactive shells
> (login or non-login) will read that file as well.
> 
> This sets the ENV environment variable in /etc/profile, pointing to
> /etc/shinit.
> 
> This also adds /etc/shinit, which:
> 
> * Contains alias and function definitions originally in /etc/profile
> 
> * Sources /etc/mkshrc if the user is using mksh (also originally in
>   /etc/profile), as /etc/mkshrc is meant for all interactive shells
> 
> * Sources ~/.mkshrc if the user is using mksh, to compensate for the
>   fact that mksh will not read ~/.mkshrc if ENV is set
> 
> * Sources ~/.shinit if the user is not using mksh
> 
> This also removes the shebang from /etc/profile, as the file is sourced,
> not executed.

FYI seems like this didnt played well with bash[1].

1. https://bugs.openwrt.org/index.php?do=details&task_id=3019

-- ynezz
diff mbox series

Patch

diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 609ffa2c38..f31f304af6 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -63,6 +63,7 @@  define Package/base-files/conffiles
 /etc/services
 /etc/shadow
 /etc/shells
+/etc/shinit
 /etc/sysctl.conf
 /etc/sysupgrade.conf
 $(call $(TARGET)/conffiles)
diff --git a/package/base-files/files/etc/profile b/package/base-files/files/etc/profile
index 9a3ac069a2..0beff1608f 100644
--- a/package/base-files/files/etc/profile
+++ b/package/base-files/files/etc/profile
@@ -1,4 +1,3 @@ 
-#!/bin/sh
 [ -e /tmp/.failsafe ] && export FAILSAFE=1
 
 [ -f /etc/banner ] && cat /etc/banner
@@ -13,6 +12,7 @@  export PATH="%PATH%"
 export HOME=$(grep -e "^${USER:-root}:" /etc/passwd | cut -d ":" -f 6)
 export HOME=${HOME:-/root}
 export PS1='\u@\h:\w\$ '
+export ENV=/etc/shinit
 
 case "$TERM" in
 	xterm*|rxvt*)
@@ -20,16 +20,6 @@  case "$TERM" in
 		;;
 esac
 
-[ -x /bin/more ] || alias more=less
-[ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi
-
-alias ll='ls -alF --color=auto'
-
-[ -z "$KSH_VERSION" -o \! -s /etc/mkshrc ] || . /etc/mkshrc
-
-[ -x /usr/bin/arp -o -x /sbin/arp ] || arp() { cat /proc/net/arp; }
-[ -x /usr/bin/ldd ] || ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
-
 [ -n "$FAILSAFE" ] || {
 	for FILE in /etc/profile.d/*.sh; do
 		[ -e "$FILE" ] && . "$FILE"
@@ -48,12 +38,3 @@  in order to prevent unauthorized SSH logins.
 --------------------------------------------------
 EOF
 fi
-
-service() {
-	[ -f "/etc/init.d/$1" ] || {
-		echo "service "'"'"$1"'"'" not found, the following services are available:"
-		ls "/etc/init.d"
-		return 1
-	}
-	/etc/init.d/$@
-}
diff --git a/package/base-files/files/etc/shinit b/package/base-files/files/etc/shinit
new file mode 100644
index 0000000000..6b715c1ef9
--- /dev/null
+++ b/package/base-files/files/etc/shinit
@@ -0,0 +1,21 @@ 
+[ -x /bin/more ] || alias more=less
+[ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi
+
+alias ll='ls -alF --color=auto'
+
+[ -z "$KSH_VERSION" -o \! -s /etc/mkshrc ] || . /etc/mkshrc
+
+[ -x /usr/bin/arp -o -x /sbin/arp ] || arp() { cat /proc/net/arp; }
+[ -x /usr/bin/ldd ] || ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
+
+service() {
+	[ -f "/etc/init.d/$1" ] || {
+		echo "service "'"'"$1"'"'" not found, the following services are available:"
+		ls "/etc/init.d"
+		return 1
+	}
+	/etc/init.d/$@
+}
+
+[ -n "$KSH_VERSION" -o \! -s "$HOME/.shinit" ] || . "$HOME/.shinit"
+[ -z "$KSH_VERSION" -o \! -s "$HOME/.mkshrc" ] || . "$HOME/.mkshrc"
diff --git a/package/base-files/files/lib/upgrade/keep.d/base-files-essential b/package/base-files/files/lib/upgrade/keep.d/base-files-essential
index 978d4b58bc..7a7a253466 100644
--- a/package/base-files/files/lib/upgrade/keep.d/base-files-essential
+++ b/package/base-files/files/lib/upgrade/keep.d/base-files-essential
@@ -6,5 +6,6 @@ 
 /etc/profile
 /etc/shadow
 /etc/shells
+/etc/shinit
 /etc/sysctl.conf
 /etc/rc.local