As a person raised by GUIs, an extra visual confirmation and an extra prompt is a nice touch. I also like when the system says “Oh, is that a directory? No problem, I’ll give you the usual treatment.” You know what I mean?

alias ls='ls --group-directories-first --color=auto -w 120'
alias ll='exa --group-directories-first -l'
alias la='ll -a'
alias lt='ll --tree'

alias cp='cp --recursive --interactive --verbose --reflink=always'
alias mv='mv --interactive --verbose'

# custom pwd
# - replace $HOME with ~
# - make everything before the last '/' green, and everything after white and bold
# - alias to p
alias pwd="pwd | sed 's:$HOME:~:' | sed -E 's:(.*/)([^/]+):\x1b[32m\1\x1b[0m\x1b[1m\2\x1b[0m:'"
alias p="pwd"

# custom cd.
# - prints the new directory after cd'ing.
cd () { 
    command cd "$@" && p;
}
alias c="cd"
alias '..'='c ..'
alias '...'='c ../..'

# For the '~' alias, we want to use the original cd because printing '~'
# again would be redundant.
alias '~'='command cd'

# custom rm.
# adds a '-r' flag only if there is a single argument and that argument
# is a directory.
# This is because I want the behavior of -I (interactive) to be the default,
# but I also want to have the -r flag available when I need it without being
# prompted for single files.
function rm () { 
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    rm --verbose --interactive=once --recursive "$1";
  else
    rm --verbose --interactive=once "$@";
  fi;
}

# mkdir + cd (created as a function because they run on the current shell,
# which is what we want for cd)
mc () { 
  mkdir -p -- "$1" && cd -P -- "$1";
}
  • @lynny
    link
    English
    81 year ago

    Be careful, as this can easily break many scripts.

    • @[email protected]OP
      link
      fedilink
      English
      5
      edit-2
      1 year ago

      shouldn’t be a problem because scripts are run non-interactively and my .bashrc wouldn’t be read, right?

      • @lynny
        link
        English
        2
        edit-2
        1 year ago

        See replies to this comment.

        That’s not necessarily the case. Most scripts will just run in the current environment (meaning your .bashrc will be used) and not define many/any arguments for commands like cp or rm.

        Your .bashrc file is read whenever you start a command line shell, so by the time you can even run a script you probably already invoked your aliases.

        Exceptions would be if you’re running a script from cron or running the script from another shell like sh or zsh.

        • @Gumshoe
          link
          English
          41 year ago

          I just did a test and did a ./test.bash in my current environment which has an alias rm='rm -i' and the rm inside the script didn’t do the aliased/interactive version. At least on my system, you’re incorrect about the exceptions, as even a straight bash script called in terminal won’t use the aliases defined in the bashrc.

          • @lynny
            link
            English
            11 year ago

            Good to know. Thanks