Posts tagged "shell":
less is literally more
As an Emacs user, your muscle memories constantly remind you of certain behavior of it when you had to use other Unix tools. I was recently viewing a large file using less and searched for ErrorCode by just typing errorcode and surprised to find that it did not find any match. Then, I searched by typing ErrorCode and it did find a match containing the word, which reminded me of the fact that less by default is case sensitive. I then set out to find if I can tell less to ignore case by reading man pages. I am pleasantly surprised to read following:
-i or --ignore-case Causes searches to ignore case; that is, uppercase and lowercase are considered identical. This option is ignored if any upper- case letters appear in the search pattern; in other words, if a pattern contains uppercase letters, then that search does not ignore case.
That is exactly how Emacs isearch behaves by default. I added following alias to my bash config to make above the default for less.
alias less='less -i'
Once again, less is literally more and you could do more using less.
One command to drive all
Over the years, I got to learn various package managers either due to tinkering with work or home infrastructure. I need to keep remembering if I am on Ubuntu, OSX or on OpenBSD if I want to install/remove/list/update packages. wouldn't it be nice if all I need to remember is just one command pkg with following neumonic options?
- s for searching for a package
- i for install a package
- r for removing a package
- l for listing installed packages
- c for checking/cleaning packages
Following shell script does exactly that. And it could also serve as your reference to all unix package managers as an added benefit.
#!/bin/sh
# One pkg command to rule them all
if [ -z "$1" ]
then
echo "Usage: pkg <i(nstall)|r(emove)|s(earch)|u(pdate)|l(ist)>"
else
os=$([[ -f /etc/os-release ]] && grep ^ID= /etc/os-release | cut -d = -f 2 || echo `uname`)
echo --------------------- $os --------------------
command=$1
shift
case $os in
*OpenBSD*)
case $command in
i)
pkg_add $@
;;
r)
pkg_delete $@
;;
s)
pkg_info -Q $@
;;
u)
pkg_add -u $@
;;
l)
pkg_info -mz
;;
c)
pkg_check
;;
esac
;;
*Arch)
case $command in
i)
yay -S $@
;;
r)
yay -Rs $@
;;
s)
yay -Ss $@
;;
u)
yay -Syyu $@
;;
l)
yay -Q $@
esac
;;
*solus*)
case $command in
i)
sudo eopkg it $@
;;
r)
sudo eopkg remove $@
;;
s)
sudo eopkg search $@
;;
u)
sudo eopkg up
;;
l)
sudo eopkg list-installed
esac
;;
VoidLinux)
case $command in
i)
sudo xbps-install $@
;;
r)
sudo xbps-remove -R $@
;;
s)
sudo xbps-query -Rs $@
;;
u)
sudo xbps-install -Su
;;
l)
sudo xbps-query -l
;;
c)
sudo xbps-remove -Oo
;;
esac
;;
pureos|PureOS|debian|Ubuntu)
case $command in
i)
sudo apt-get install $@
;;
r)
sudo apt-get remove $@
;;
s)
apt-cache search $@
;;
u)
sudo apt-get update && sudo apt-get upgrade
;;
l)
sudo apt list --installed
;;
c)
sudo apt-get autoremove
;;
esac
;;
darwin*|Darwin*)
case $command in
i)
brew install $@
;;
r)
brew remove $@
;;
s)
brew search $@
;;
u)
brew update
;;
l)
brew list
;;
c)
brew cleanup
;;
esac
;;
*)
echo "Unknown OS. Please add it to $(basename "$0") pkg function"
esac
fi
If you happen to use Emacs and Eshell, you can just use following alias to get going:
alias pkg ./pkg '$*'
Eshell aliases are great. You can pass arguments to them just prefixing aliases with '$*' as I did above. Try doing same with bash alias, you are out of luck and you have to write shell functions be able to do that. Enjoy!