For comfortable work in the console, not so much is required – the usual aliases, environment variables, locale settings, readline
settings (file ~/.inputrc
), screen
, etc. And it is desirable that all these settings are the same, no matter in which console you are working right now, in Ubuntu, CentOS, macOS or Synology.
I have tried to unify the files with these settings, so that you can copy them to your home folder on the newly installed system and continue to work in the usual environment.
Preparing folders for configuration files:
$ mkdir -p ~/.config/bashrc
$ mkdir -p ~/.config/bashrc.d
In the folder ~/.config/bashrc
will contain standard files from the home folder (.inputrc
, .screenrc
, .bash_profile
and .bash_logout
). In the home folder are symlinks to these files. And in folder ~/.config/bashrc.d
– there will be various configuration files that will be read during the ~/.bash_profile
automatically.
Configuring readline
:
$ nano -w ~/.config/bashrc/.inputrc
"\e[1;3C": forward-word
"\e[1;3D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[7~": beginning-of-line
"\e[8~": end-of-line
"\eOH": beginning-of-line
"\eOF": end-of-line
"\e[H": beginning-of-line
"\e[F": end-of-line
"\e[5~": history-search-backward
"\e[6~": history-search-forward
$ ln -s ~/.config/bashrc/.inputrc ~/.inputrc
Configuring bash
scripts:
#----------------------------------------------------------------------------
# ~/.bash_profile: executed by bash(1) for login shells.
# $Revision: 2.30 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# Test for an interactive shell. There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
if [[ $- != *i* ]] ; then
# Shell is non-interactive. Be done now!
return
fi
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Include ~/.config/bashrc.d/* if it exists
if [ -d ~/.config/bashrc.d ]; then
for i in `ls ~/.config/bashrc.d/` ; do
if [[ -f ~/.config/bashrc.d/${i} ]]; then
. ~/.config/bashrc.d/${i}
fi
done
unset i
fi
$ nano -w ~/.config/bashrc/.bash_logout
#----------------------------------------------------------------------------
# ~/.bash_logout: executed by bash(1) when login shell exits.
# $Revision: 2.20 (CentOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# When leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
[ -x /usr/bin/clear ] && /usr/bin/clear
fi
$ ln -s ~/.config/bashrc/.bash_profile ~/.bash_profile
$ ln -s ~/.config/bashrc/.bash_logout ~/.bash_logout
$ ln -s ~/.bash_profile ~/.bashrc
$ nano -w ~/.config/bashrc.d/00-aliases
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/00-aliases: executed by .bash_profile for aliases
# $Revision: 2.30 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# Alias definitions.
alias cp='cp -i'
alias df='df -Ph'
alias du='du -h'
alias less='less -r'
alias ll='ls -lp'
alias mc='mc -x -S xoria256'
alias mcdiff='mcdiff -x -S xoria256'
alias mcedit='mcedit -x -S xoria256'
alias mcview='mcview -x -S xoria256'
alias md='mkdir'
alias mtr='mtr -o "LRSD NBAWV"'
alias mv='mv -i'
alias nano='nano -Scmw'
alias pman='pinfo -m'
alias px='ps xa'
alias rd='rmdir'
alias rm='rm -i'
alias scp='scp -p -r'
alias screen='[ -z "$HUSHLOGIN" ] && TERM=xterm-256color screen -D -RR || TERM=linux screen -D -RR'
alias ssh-suppress='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
alias su='su -'
alias sudo='sudo -s '
alias showextip='curl http://ipecho.net/plain; echo'
alias watch='watch '
alias who='who -HuT'
#[[ $(wget --help) == *hsts* ]] && alias wget='wget --no-hsts'
flushdns () {
if [ "$OSTYPE" == "linux-gnu" ]; then
if hash systemd-resolve 2>/dev/null; then
sudo systemd-resolve --flush-caches;
else
sudo rndc flush;
fi
else
sudo dscacheutil -flushcache;
sudo killall -HUP mDNSResponder;
say "cache flushed";
fi
}
tail () {
if hash ccze 2>/dev/null; then
/usr/bin/tail "$@" | ccze -A -o lookups=no;
else
/usr/bin/tail "$@";
fi
}
telnet () {
if hash gtelnet 2>/dev/null; then
/opt/local/bin/gtelnet "$@";
else
/usr/bin/telnet "$@";
fi
}
wget () {
if [ "$OSTYPE" == "linux-gnu" ]; then
WGET=/usr/bin/wget
else
WGET=/opt/local/bin/wget
fi
if [ "$($WGET --help)" == "*hsts*" ]; then
$WGET --no-hsts "$@";
else
$WGET "$@";
fi
}
$ nano -w ~/.config/bashrc.d/01-locale
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/01-locale: executed by .bash_profile for locale settings
# $Revision: 2.30 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# Locale definitions.
export LC_ALL=""
export LANG="ru_RU.UTF-8"
export LC_NUMERIC="C"
export LC_TIME="POSIX"
export TIME_STYLE="+%Y-%m-%d"
# Set english messages for root.
[ ${EUID} == 0 ] && export LC_MESSAGES="POSIX"
$ nano -w ~/.config/bashrc.d/02-terminal
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/02-terminal: executed by .bash_profile for terminal settings
# $Revision: 2.31 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
vt220) color_prompt=yes;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
if [ ${EUID} == 0 ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
if [ "${TERM_PROGRAM}" == "Apple_Terminal" ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;36m\]\u\[\033[00m\]@\[\033[01;36m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;33m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi
fi
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
$ nano -w ~/.config/bashrc.d/03-userfiles
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/03-userfiles: executed by .bash_profile for user files
# $Revision: 2.30 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# User specific environment and startup programs
if [ -d $HOME/.local/bin ]; then
PATH=$PATH:$HOME/.local/bin
export PATH
fi
# do the same with MANPATH
if [ -d $HOME/.local/share/man ]; then
MANPATH=${MANPATH:-:}:$HOME/.local/share/man
export MANPATH
fi
XDG_CONFIG_HOME=$HOME/.config
XDG_CACHE_HOME=$HOME/.local/share
XDG_DATA_HOME=$HOME/.local/share
export XDG_CONFIG_HOME
export XDG_CACHE_HOME
export XDG_DATA_HOME
$ nano -w ~/.config/bashrc.d/04-bash_completion
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/04-bash_completion: executed by .bash_profile for user files
# $Revision: 1.10 (CentOS Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
$ nano -w ~/.config/bashrc.d/05-apache
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/05-apache: executed by .bash_profile for user files
# $Revision: 1.10 (CentOS Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
[[ ! -d /etc/httpd/vhost.d ]] && return
__a2ensite() {
if [ "$1" == "" ]; then
echo "Usage: a2ensite www.example.com"
elif [ ! -f "/etc/httpd/vhost.d/_vhost-$1" ]; then
echo "ERROR: Site $1 does not exist!"
else
mv -v /etc/httpd/vhost.d/{_,}vhost-$1
echo "Run 'systemctl reload httpd' to activate new configuration!"
fi
}
__a2dissite() {
if [ "$1" == "" ]; then
echo "Usage: a2dissite www.example.com"
elif [ ! -f "/etc/httpd/vhost.d/vhost-$1" ]; then
echo "ERROR: Site $1 does not exist!"
else
mv -v /etc/httpd/vhost.d/{,_}vhost-$1
echo "Run 'systemctl reload httpd' to activate new configuration!"
fi
}
alias a2ensite=__a2ensite
alias a2dissite=__a2dissite
$ nano -w ~/.config/bashrc.d/06-serial
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/06-serial: executed by .bash_profile for serial console
# $Revision: 1.10 (CentOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
res() {
old=$(stty -g)
stty raw -echo min 0 time 5
printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
IFS='[;R' read -r _ rows cols _ < /dev/tty
stty "$old"
# echo "cols:$cols"
# echo "rows:$rows"
stty cols "$cols" rows "$rows"
}
res2() {
old=$(stty -g)
stty raw -echo min 0 time 5
printf '\033[18t' > /dev/tty
IFS=';t' read -r _ rows cols _ < /dev/tty
stty "$old"
# echo "cols:$cols"
# echo "rows:$rows"
stty cols "$cols" rows "$rows"
}
TTY=$(tty)
TMP=${TTY:5}
if [[ "$TMP" == "ttyS"* ]]; then
eval "$(TERM=linux dircolors -b)"
unalias mc >/dev/null
unalias mcdiff >/dev/null
unalias mcedit >/dev/null
unalias mcview >/dev/null
alias mc='TERM=xterm mc --color -S default'
alias mcdiff='TERM=xterm mcdiff --color -S default'
alias mcedit='TERM=xterm mcedit --color -S default'
alias mcview='TERM=xterm mcview --color -S default'
res
fi
$ nano -w ~/.config/bashrc.d/90-entware-ng
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/90-entware-ng: executed by .bash_profile for entware-ng
# $Revision: 1.20 (Synology Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# PATH environment variable for use with entware-ng
[ -d /opt/sbin ] && export PATH="/opt/sbin:$PATH"
[ -d /opt/bin ] && export PATH="/opt/bin:$PATH"
$ nano -w ~/.config/bashrc.d/90-macports
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/90-macports: executed by .bash_profile for MacPorts settings
# $Revision: 1.20 (macOS Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# PATH environment variable for use with MacPorts
[ -d /opt/local/sbin ] && export PATH="/opt/local/sbin:$PATH"
[ -d /opt/local/bin ] && export PATH="/opt/local/bin:$PATH"
export CLICOLOR=1
# Bash completion for use with MacPorts
if [ -f /opt/local/etc/profile.d/bash_completion.sh ]; then
. /opt/local/etc/profile.d/bash_completion.sh
fi
$ nano -w ~/.config/bashrc.d/98-synology
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/98-synology: executed by .bash_profile for other settings
# $Revision: 1.00 (Synology Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
[[ ! -d /usr/syno ]] && return
export SHELL=/bin/bash
$ nano -w ~/.config/bashrc.d/99-other
#----------------------------------------------------------------------------
# ~/.config/bashrc.d/99-other: executed by .bash_profile for other settings
# $Revision: 2.20 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# Don't put duplicate and garbage lines from Midnight Commander to the history.
export HISTCONTROL="ignoreboth"
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# if set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
Configuring screen
:
screen
in this example is configured in such a way that when you start it – 10 consoles are created, and switching between them is as convenient as if you were sitting at the Linux console, by pressing Alt+F1
, Alt+F2
, .. to Alt+F10
.
$ nano -w ~/.config/bashrc/.screenrc
#----------------------------------------------------------------------------
# ~/.screenrc: executed by screen for user settings
# $Revision: 2.20 (CentOS/macOS/Ubuntu Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
hardstatus string "[screen %n%?: %t%?] %h"
# defshell -bash
shell -$SHELL
# VARIABLES
# ===============================================================
# Automatically detach on hangup.
autodetach on # default: on
# Don't display the copyright page
startup_message off # default: on
# Affects the copying of text regions
crlf off # default: off
# Change default scrollback value for new windows
defscrollback 1000 # default: 100
# Define the time that all windows monitored for silence should
# wait before displaying a message. Default 30 seconds.
silencewait 15 # default: 30
# UTF-8 support
defutf8 on
# PuTTY tweaks
termcapinfo xterm* 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
termcapinfo xterm* ti@:te@
term xterm-256color
# term xterm
attrcolor b ".I"
defbce on
# KEYBINDINGS
# ==============================================================
# Alt+Fn keys.
bindkey "^[^[OC" next
bindkey "^[^[OD" prev
bindkey "^[^[OP" select 0
bindkey "^[^[OQ" select 1
bindkey "^[^[OR" select 2
bindkey "^[^[OS" select 3
bindkey "^[^[[15~" select 4
bindkey "^[^[[17~" select 5
bindkey "^[^[[18~" select 6
bindkey "^[^[[19~" select 7
bindkey "^[^[[20~" select 8
bindkey "^[^[[21~" select 9
# STARTUP SCREENS
# ===============================================================
# Uncomment one/some following lines to automatically let
# SCREEN start some programs in the given window numbers:
# screen -t IRC 1 irssi
# screen -t EDIT 1 vim
# screen -t GOOGLE 2 links http://www.google.com
# screen -t NEWS 3 slrn
# screen -t WWW 4 links http://rt.com
screen -t F1 0
screen -t F2 1
screen -t F3 2
screen -t F4 3
screen -t F5 4
screen -t F6 5
screen -t F7 6
screen -t F8 7
screen -t F9 8
screen -t F10 9
select 0
$ ln -s ~/.config/bashrc/.screenrc ~/.screenrc