Hemanth's Scribes

web

Edit Dot Rc Files and Auto Source

Author Photo

Hemanth HM

Thumbnail

Edit Dot Rc Files and Auto Source

Dot rc files are not supported by all the shell, but on those which it’s supported we often edit ~/.”$SHELL”rc files and source them or exec the shell. I made a small python app using which one can select the login shell from the list of shells installed in the current system.

Here is the list which makes things clear:

Type of shell.rc support?Path to rc
bashyes~/.bashrc
ashyes~/.ashrc
dashyes~/.dashrc
fishyes~/.fish
bashyes~/.bashro
kshyes~/.kshrc
cshyes~/.cshrc
tshyes~/.tshrc
shnoNone

Wrote a simple script in python to edit and source any of these dotfile

#!/usr/bin/evn python
"""
This utility helps to edit the dotrc file of the current shell,
then invoke the same, there by avioding the overhead on the user
to source rc or exec $SHELL each time there is an addition in 
the rc """


__author__ = "Hemanth HM"
__email__ = "[email protected]"
__license__ = "GPLV3"

import os
import sys
import subprocess

class edrc:

    def edit(self,shell):
         ''' If the shell is sh, exit as it does not use rc '''
         shell=os.path.basename(shell)
         if shell == 'sh' :
             print "sh does not supprot rc!"
             sys.exit(1)

         ''' Set the rc file path '''
         if shell == 'fish':
            rc='~/.fish'
         rc='~/.'+shell+'rc'

         ''' Else select a sensible editor '''
         editor = "vi"
         if "VISUAL" in os.environ:
            editor = os.environ["VISUAL"]
         elif "EDITOR" in os.environ:
            editor = os.environ["EDITOR"]

         ''' Edit the rc '''
         subprocess.call ([editor,os.path.expanduser(rc)])

         ''' Reinvoke the shell '''
         print "Reinvoking the shell"
         os.system(shell)
    
        
    def get_opt(self):
        ''' Get the current shell from the process tree 
        *bad* way to get the pid of from which the script was forked 
        shell = os.popen("ps -o comm= -p" +\
                        str(os.getppid())).readlines()[0].splitlines() '''
        
        ''' Get all the valid login shells '''
        shells = list()
        with open('/etc/shells') as f:
            for line in f:
                line = line.split('#', 1)[0].strip()
                if not line:
                    continue
                if os.path.exists(line):
                    shells.append(line)


        ''' Enumerate over them to print the options '''
        for i,shell in enumerate(shells):
            print '%i %s %s'% (i+1,"=>",shell)
        
        ''' Read input option '''
        ''' Trap keyboard Interrupts '''        
        try:
            rc=raw_input('Select the shell for which you need to \
                        edit/create rc [ Any other key to exit ] : ')

        except (KeyboardInterrupt, SystemExit):
            print "\n"
            sys.exit(1)

        ''' Validate inputs '''
        if rc >= len(shells):
            sys.exit(1)
 
        try:
            int(rc)
        except ValueError, e:
            sys.exit(1)
        
    
        ''' If all clear edit '''
        self.edit(shells[rc-1])
        
def main():
    ed = edrc()
    ed.get_opt()
 
if __name__ == "__main__":
    main()

GET the DEB

Sample output:

:~/projects/futhark$ edrc
1 => /bin/csh
2 => /bin/sh
3 => /usr/bin/tcsh
4 => /bin/tcsh
5 => /bin/dash
6 => /bin/bash
7 => /bin/rbash
8 => /usr/bin/screen
Select the shell for which you need to edit/create rc [ Any other key to exit ] :
#javascript#linux
Author Photo

About Hemanth HM

Hemanth HM is a Sr. Machine Learning Manager at PayPal, Google Developer Expert, TC39 delegate, FOSS advocate, and community leader with a passion for programming, AI, and open-source contributions.