Shopt: Not Found [No Such File Or Directory]

The Problem

When a user logs in to the terminal using a user with the korn shell (ksh) the following messages occur:

Shopt: Not Found [No Such File Or Directory]

The Solution

The following line was added on /etc/profile:

shopt -s histappend

Note:
/etc/profile is a configuration file which sets the global environment for all users. As per man page of shopt:

# man shopt

 shopt is part of BASH_BUILTINS
        -s  Display readline key sequences bound to macros and the strings they output in such 
            a way that they can be re-read.

        histappend
            If set, the history list is appended to the file named by the value of the 
            HISTFILE variable when the shell exits, rather than overwriting the file

The issue is with KSH since shopt is part of BASH_BUILTINS. As per the /etc/passwd file the user shell is “ksh” and not “bash”:

# grep -i test /etc/passwd
testuserX:x:54322:54323::/home/testuserX:/bin/bash
test1:x:54323:112::/home/test1:/bin/ksh

==============
/etc/profile :
==============

47 TMOUT=14400
48 HOSTNAME=`/bin/hostname 2>/dev/null`
49 HISTSIZE=1000
50 HISTTIMEFORMAT='%F.%T '
51 shopt -s histappend   

If we switch to user test we will find the following messages :

# su - test1
/etc/profile[277]: shopt: not found [No such file or directory]

Solution 1

1. Edit the file /etc/profile and Comment line 51: shopt -s histappend:

# vi /etc/profile
#shopt -s histappend

2. Reload the profile or exit from terminal and login again.

# source /etc/profile .

3. Login Again:

# su - test1
$
$ whoami
test1
Note : If you need to use this line shopt -s histappend for specific user like root it is advised to use that option on the bash_profile for root user or or any other user that is using bash as default.

For example :

# cat /root/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

User specific environment and startup programs:

PATH=$PATH:$HOME/bin
shopt -s histappend
export PATH
export HISTTIMEFORMAT="%

Remove it from /etc/profile:

# cat /etc/profile| grep -i shopt
#

Solution 2

Change the Shell from ksh to bash for user test1 .

1. Verify your currents Shell:

# chsh -l test1
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/ksh

2. Change it to bash

# chsh -s /bin/bash test1
Changing shell for test1.
Shell changed.
# cat /etc/passwd|grep -i test1
test1:x:54323:112::/home/test1:/bin/bash
#

3. Verify and test the new shell:

# su - test1
$ whoami
test1
$
Related Post