Есть ли что-нибудь, без чего вы не можете жить и что сделает мою жизнь НАСТОЛЬКО легче? Вот некоторые из них, которые я использую (особенно удобны «дисковое пространство» и «папки»).
# some more ls aliases
alias ll='ls -alh'
alias la='ls -A'
alias l='ls -CFlh'
alias woo='fortune'
alias lsd="ls -alF | grep /$"
# This is GOLD for finding out what is taking so much space on your drives!
alias diskspace="du -S | sort -n -r |more"
# Command line mplayer movie watching for the win.
alias mp="mplayer -fs"
# Show me the size (sorted) of only the folders in this directory
alias folders="find . -maxdepth 1 -type d -print | xargs du -sk | sort -rn"
# This will keep you sane when you're about to smash the keyboard again.
alias frak="fortune"
# This is where you put your hand rolled scripts (remember to chmod them)
PATH="$HOME/bin:$PATH"
У меня есть небольшой скрипт для извлечения архивов, я его где-то в сети нашел:
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
Поскольку я использую очень много разных машин, мои .bashrc
всегда устанавливает в командной строке, среди прочего, имя сервера, на который я сейчас вошел. Таким образом, когда я нахожусь на трех уровнях в telnet / ssh, я не печатаю что-то не то в неправильном окне. Это действительно отстой rm -rf .
не в том окне! (Примечание: дома telnet отключен на всех машинах. На работе ssh не всегда включен, и у меня нет root-доступа к очень многим машинам.)
У меня есть сценарий ~/bin/setprompt
это выполняется моим .bashrc
, который содержит:
RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"
# Throw it all together
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "
Этот сценарий устанавливает приглашение для имени хоста, за которым следует :)
если последняя команда была успешной и :(
если последняя команда не удалась.
Цвет для страниц руководства в меньшем количестве упрощает чтение руководств:
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'
Цветные страницы руководства также можно получить, установив большинство из них и используя их как переменную MANPAGER env. Если вы хотите использовать этот пейджер не только для мужчин, используйте переменную PAGER, например:
export PAGER="/usr/bin/most -s"
Увеличивается на многие каталоги, поскольку число, переданное в качестве аргумента, по умолчанию не увеличивается на 1 (найдено в ссылке в комментарии на stackoverflow.com и немного изменено)
up(){
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
Я имею дело с множеством разных машин, поэтому один из моих любимых - это псевдонимы для каждой машины, которые мне нужно часто использовать SSH для:
alias claudius="ssh dinomite@claudius"
Также полезно настроить хороший .ssh/config
и ssh ключи чтобы сделать переключение между машинами еще проще.
Еще один из моих любимых псевдонимов - для перемещения вверх по каталогам:
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
И некоторые для часто используемых вариантов ls
(и опечатки):
alias ll="ls -l"
alias lo="ls -o"
alias lh="ls -lh"
alias la="ls -la"
alias sl="ls"
alias l="ls"
alias s="ls"
История может быть очень полезной, но по умолчанию в большинстве дистрибутивов ваша история сдувается при каждом выходе из оболочки, и с самого начала она не содержит много информации. Мне нравится иметь 10000 строк истории:
export HISTFILESIZE=20000
export HISTSIZE=10000
shopt -s histappend
# Combine multiline commands into one in history
shopt -s cmdhist
# Ignore duplicates, ls without options and builtin commands
HISTCONTROL=ignoredups
export HISTIGNORE="&:ls:[bf]g:exit"
Таким образом, если я знаю, что делал что-то раньше, но не могу вспомнить подробности, быстро history | grep foo
поможет пробудить мою память.
Я часто обнаруживал, что пропускаю вывод через awk
чтобы получить определенный столбец вывода, как в df -h | awk '{print $2}'
чтобы узнать размер каждого из моих дисков. Чтобы упростить задачу, я создал функцию fawk
в моем .bashrc:
function fawk {
first="awk '{print "
last="}'"
cmd="${first}\$${1}${last}"
eval $cmd
}
Теперь я могу бежать df -h|fawk 2
что позволяет сэкономить при вводе текста.
Если вам нужно указать разделитель (например, awk -F:
для /etc/passwd
), эта функция, очевидно, не справится. Немного переработанная версия в это суть может обрабатывать произвольные awk
аргументы перед номером поля (но по-прежнему требуется ввод из стандартного ввода).
Я уверен, что у всех нас есть вещи, которые мы хотели бы добавить в наш bashrc, но не хотим, чтобы их легко читали sudoers. Мое решение:
if [ -f ~/.bash_private.gpg ]; then
eval "$(gpg --decrypt ~/.bash_private.gpg 2>/dev/null)"
fi
У меня есть агент GPG, который заставляет меня вводить пароль моего закрытого ключа только раз в несколько часов. Вы по-прежнему должны иметь некоторое доверие к пользователям системы, потому что ваши переменные, функции и псевдонимы, которые вы определяете, могут быть извлечены из ОЗУ. Однако я использую это в основном для своего ноутбука. Если его украдут, я не хочу, чтобы кто-то легко увидел такие вещи, как:
alias MYsql='mysql -uadmin -psecret'
wglatest(){ wget -O https://admin:secret@server.com/latest; }
Раньше я настраивал их повсюду, но потом понял, что лучше просто вспомнить, как делать их «вручную», потому что это означало, что я бы 1) полностью понял, что происходит, и 2) имел доступ к этим возможностям, даже если мой собственный .bashrc не был установлен.
Единственное, что я использую сейчас псевдонимы, - это сократить повторяющийся набор действительно длинных строк (например, alias myhost='ssh -T user@my.remote.host screen -dAr'
)
это отличный ресурс для этого:
Небольшой совет для Bash, если вы системный администратор и много работаете с привилегиями root:
shopt -o noclobber
Это предотвратит случайное уничтожение содержимого уже существующего файла при перенаправлении вывода (> имя файла). Вы всегда можете принудительно перезаписать> | filename.
Однострочники и крошечные скрипты могут существовать вечно. Я рекомендую man bash и писать самому. Несколько хороших коротких вещей в http://www.commandlinefu.com. Вот несколько вещей.
#use extra globing features. See man bash, search extglob.
shopt -s extglob
#include .files when globbing.
shopt -s dotglob
#When a glob expands to nothing, make it an empty string instead of the literal characters.
shopt -s nullglob
# fix spelling errors for cd, only in interactive shell
shopt -s cdspell
# vi mode
set -o vi
s() { # do sudo, or sudo the last command if no argument given
if [[ $# == 0 ]]; then
sudo $(history -p '!!')
else
sudo "$@"
fi
}
prompt_command() {
p=$PWD # p is much easier to type in interactive shells
# a special IFS should be limited to 1 liners or inside scripts.
# Otherwise it only causes mistakes.
unset IFS
}
PROMPT_COMMAND=prompt_command
# smart advanced completion, download from
# http://bash-completion.alioth.debian.org/
if [[ -f $HOME/local/bin/bash_completion ]]; then
. $HOME/local/bin/bash_completion
fi
extract () { # extract files. Ignore files with improper extensions.
local x
ee() { # echo and execute
echo "$@"
$1 "$2"
}
for x in "$@"; do
[[ -f $x ]] || continue
case "$x" in
*.tar.bz2 | *.tbz2 ) ee "tar xvjf" "$x" ;;
*.tar.gz | *.tgz ) ee "tar xvzf" "$x" ;;
*.bz2 ) ee "bunzip2" "$x" ;;
*.rar ) ee "unrar x" "$x" ;;
*.gz ) ee "gunzip" "$x" ;;
*.tar ) ee "tar xvf" "$x" ;;
*.zip ) ee "unzip" "$x" ;;
*.Z ) ee "uncompress" "$x" ;;
*.7z ) ee "7z x" "$x" ;;
esac
done
}
В моем bashrc есть следующее
function __setprompt {
local BLUE="\[\033[0;34m\]"
local NO_COLOUR="\[\033[0m\]"
local SSH_IP=`echo $SSH_CLIENT | awk '{ print $1 }'`
local SSH2_IP=`echo $SSH2_CLIENT | awk '{ print $1 }'`
if [ $SSH2_IP ] || [ $SSH_IP ] ; then
local SSH_FLAG="@\h"
fi
PS1="$BLUE[\$(date +%H:%M)][\u$SSH_FLAG:\w]\\$ $NO_COLOUR"
PS2="$BLUE>$NO_COLOUR "
PS4='$BLUE+$NO_COLOUR '
}
__setprompt
На локальной машине это выглядит так:
[17:57][user:~]$
но на пульте (через ssh) это:
[17:57][user@machine:~]$
Некоторое время это было в моем .bashrc, и я нашел это полезным. Если вы заходите в окно, он автоматически запускает экран при входе в систему, таким образом, когда ваше сетевое соединение прерывается или что-то еще, вы не теряете то, что делали. Его следует разместить в конце.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
STARTED_SCREEN=1 ; export STARTED_SCREEN
[ -d $HOME/lib/screen-logs ] || mkdir -p $HOME/lib/screen-logs
sleep 1
screen -U -RR && exit 0
echo "Screen failed! continuing with normal bash startup"
fi
Отслеживайте все журналы в / var / log
alias logs="find /var/log -type f -exec file {} \; | grep 'text' | cut -d' ' -f1 | sed -e's/:$//g' | grep -v '[0-9]$' | xargs tail -f"
У меня есть несколько битов:
# stop the pc speaker ever annoying me :)
setterm -bfreq 0
# don't put duplicate lines in the history. See bash(1) for more options
HISTCONTROL=ignoredups
# ... and ignore same sucessive entries.
HISTCONTROL=ignoreboth
# Expand the history size
HISTFILESIZE=10000
HISTSIZE=100
# commands with leading space do not get added to history
HISTCONTROL=ignorespace
# am I on the internet?
alias p4='ping 4.2.2.2 -c 4'
# pwsafe
alias pw='pwsafe -p'
# ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias lt='ls -laptr' #oldest first sort
alias labc='ls -lap' #alphabetical sort
# cd aliases
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
# cd into the old directory
alias bd='cd "$OLDPWD"'
# install a package and automatically respond yes to confirmation prompt
alias ins="sudo aptitude install"
# remove a package and its configuration files
alias remp="sudo aptitude purge"
# search for a package - apt-cache and aptitude search in different ways
# so have both
alias searchc="apt-cache search"
alias search="aptitude search"
alias show="aptitude show"
Среди прочего, я установил некоторые значения по умолчанию на меньшую величину, предотвращаю случайное закрытие терминала и включаю прямую навигацию по истории:
# ignore case, long prompt, exit if it fits on one screen, allow colors for ls and grep colors
export LESS="-iMFXR"
# must press ctrl-D 2+1 times to exit shell
export IGNOREEOF="2"
# allow ctrl-S for history navigation (with ctrl-R)
stty -ixon
Сколько псевдонимов fortune
тебе вообще нужно?
Мне нравится делать cdd
псевдоним, который приведет меня туда, где я, скорее всего, сейчас работаю на этом сервере.
PATH
переопределение действительно принадлежит .bash_profile
не .bashrc
.
На сервере, где я обычно использую большой набор screen
с, мой .bashrc
будет:
alias s1="screen -dr chaos1"
alias s2="screen -dr chaos2"
alias s3="screen -dr chaos3"
# ... and so on
(The screen
s были созданы, например, screen -U -S chaos1
.)
Псевдоним "папки" великолепен! Я немного изменил его, чтобы каталоги с пробелами не вызывали ошибок.
alias folders='find . -maxdepth 1 -type d -print0 | xargs -0 du -sk | sort -rn'
Чтобы иметь цвета для всех команд grep, таких как grep, egrep и zgrep, у меня есть следующее в моем .bashrc
export GREP_OPTIONS='--color=auto'
Вот мины:
export HISTCONTROL=ignoredups
export HISTIGNORE="&:ls:bg:fg"
# 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
# shows you if you are in a chroot or in a git repository
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;30m\]\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]$(__git_ps1)\$ '
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
# two handy single-letter aliases
alias u='ls -hltr'
alias e='du * -cs | sort -nr | head'
alias g='grep -C5 --color=auto'
# creates a temp dir and cds into it
alias td='pushd $(mktemp -d)'
# find <dir> <file name regexp> <file contents regexp>
function fing { find "$1" -name "$2" -exec grep -H "$3" "{}" \; }
# shows "git diff" across any project in any subdirectory
alias git-differ='for g in $(find . -name ".git"); do g=${g%%.git};printf "$g\t\t\t";pu $g >/dev/null && git diff |wc -l; p >/dev/null; done'
# does git house keeping across any project in any subdirectory
alias git-housekeep='for g in $(find . -name ".git"); do g=${g%%.git};echo $g;pu $g && git repack && git gc --auto && p;done'
# Debian update
alias apg='aptitude update && aptitude dist-upgrade && aptitude clean'
# Quick way to serve files in HTTP from the local dir
alias webs='python -m SimpleHTTPServer'
Shell-fu.org.bashrc коллекция
Попросите bash проверить, изменился ли размер окна (предотвращает странное редактирование строк, если вы измените размер окна терминала)
shopt -s checkwinsize
Это мой любимый. Заставляет bash добавить к истории вместо перезапись Это. Обычно, когда вы запускаете bash, он загружает историю в память, а когда вы закрываете ее, она записывает ее. Это означает, что если вы загружаете две оболочки, используете обе, а затем закрываете обе, та, которую вы закрыли последней, перезаписывает все изменения.
Этот фрагмент заставляет его сначала только добавлять изменения (а не перезаписывать весь буфер), а затем заставляет его после каждой команды записывать изменения. По сути, вы получаете динамически обновляемый .bash_history, поэтому, если вы запустите новый терминал, у вас будут все команды из истории других запущенных сеансов.
shopt -s histappend
PROMPT_COMMAND='history -a'
Я бы повторил комментарий @pjz о том, чтобы знать вещи вручную, а не настраивать их. Особенно если у вас есть доступ к многочисленным машинам, как я, кажется, всегда делаю.
Я точно знаю, что set -o vi
потому что я знаю команды редактирования vi в bash и не знаю команды emacs (кроме того, Ctrl + A мешает screen
). В свои коробки я положил это .bashrc
Я также считаю, что мне нужно включить export EDITOR=vim
потому что в ряде недавних дистрибутивов по умолчанию используется nano, что очень раздражает, если в него бросается утилита, которая требует, чтобы вы что-то отредактировали, когда я ожидал vi. : - /
Я также изменяю свою подсказку. Давным-давно я обнаружил, что добавление последнего кода ошибки достаточно полезно, и мне это нравится. И мне нравится полный путь в подсказке. И нынешний screen
номер тоже. И имеет смысл указать текущего пользователя и имя хоста. Моя подсказка PS1='\u@\h $PWD $WINDOW [$?] \$ '
Из Автоматизация администрирования Linux и Unix Кирк Бауэр (отличная книга!)
PS1='\n[\u@\h]: \w\n$?> '
Новая строка в начале принадлежит мне, мне нравится, чтобы между предыдущим выводом и приглашением была четкая линия. Остальное:
\ u = имя пользователя
\ h = хост
\ w = рабочий каталог
$? = последний код возврата
Я использую это примерно 20 раз в день, чтобы перейти в последний измененный каталог:
cl()
{
last_dir="$(ls -Frt | grep '/$' | tail -n1)"
if [ -d "$last_dir" ]; then
cd "$last_dir"
fi
}
Эти два хранят постоянные закладки часто используемых каталогов:
rd(){
pwd > "$HOME/.lastdir_$1"
}
crd(){
lastdir="$(cat "$HOME/.lastdir_$1")">/dev/null 2>&1
if [ -d "$lastdir" ]; then
cd "$lastdir"
else
echo "no existing directory stored in buffer $1">&2
fi
}
Вот некоторые из моих любимых:
alias ls='ls -F --color=auto'
alias l='ls'
alias ll='ls -ahl'
alias ..='cd ..'
alias ...='cd ../..'
alias mv='mv -i'
mkcd() {
if [ $# != 1 ]; then
echo "Usage: mkcd <dir>"
else
mkdir -p $1 && cd $1
fi
}
# Git related
alias gs='git status'
alias gc='git commit'
alias ga='git add'
alias gd='git diff'
alias gb='git branch'
alias gl='git log'
alias gsb='git show-branch'
alias gco='git checkout'
alias gg='git grep'
alias gk='gitk --all'
alias gr='git rebase'
alias gri='git rebase --interactive'
alias gcp='git cherry-pick'
alias grm='git rm'
Это мои любимые:
export HISTFILESIZE=1000000000
export HISTSIZE=1000000
Мне нравится, когда история командной строки никогда не забывается.
К сожалению, некоторое время назад я запустил оболочку из cron, которая почему-то не читала .bashrc, и урезал все до 500 строк, уничтожив многолетнюю историю. Поэтому я рекомендую зайти в / etc / bashrc.
Я использую свой bashrc на многих машинах, поэтому у меня есть этот небольшой фрагмент, чтобы убедиться, что LS окрашен. Это исправит это на машинах OSX, возможно даже * BSD, если вы настроите строку uname.
if [ "$TERM" != "dumb" ]; then
if [ `uname` == "Darwin" ]; then
alias ls='ls -G'
else
eval "`dircolors -b`"
alias ls='ls --color=auto'
fi
fi
Кроме того, у меня есть команда для резервного копирования файла, полезная, если вы собираетесь изменить файл конфигурации и хотите сделать быструю копию заранее.
bu () { cp $1 ~/.backup/`basename $1`-`date +%Y%m%d%H%M`.backup ; }
Я вручную компилирую несколько вещей в $ HOME / local, поэтому у меня есть этот небольшой фрагмент:
for prog in $HOME/local/*
do
if [ -d "$prog/bin" ]; then
export PATH=$prog/bin:$PATH
fi
if [ -d "$prog/include" ]; then
export C_INCLUDE_PATH=$prog/include:$C_INCLUDE_PATH
fi
if [ -d "$prog/lib" ]; then
export LD_LIBRARY_PATH=$prog/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$prog/lib:$LIBRARY_PATH
fi
if [ -d "$prog/man" ]; then
export MANPATH=$prog/man:$MANPATH
fi
if [ -d "$prog/share/man" ]; then
export MANPATH=$prog/share/man:$MANPATH
fi
done
У меня также есть IRC-клиент на моем сервере, работающий на экране, поэтому у меня есть это (не вещь .bashrc, но все же полезная)
#!/usr/bin/env bash
RUNNING=`screen -ls | grep irc`
if [ "" = "$RUNNING" ]; then
screen -S irc irssi
else
screen -dr irc
fi
Это один из моих любимых:
alias ssh='if [ "$(ssh-add -l)" = "The agent has no identities." ]; then ssh-add; fi; /usr/bin/ssh "$@"'
Если я забыл пройти аутентификацию, это позволит мне сделать это, не тратя впустую набирать текст на ssh-add. после сеанс ssh.
Пара хороших
Сделайте так, чтобы SSH автоматически завершал имя хоста, на которое вы отправляете ssh (если оно есть в вашей конфигурации или истории)
complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh
Некоторые полезные настройки завершения bash
bind "set completion-ignore-case on" # note: bind used instead of sticking these in .inputrc
bind "set bell-style none" # no bell
bind "set show-all-if-ambiguous On" # show list automatically, without double tab
Несколько полезных для Mac OS X
alias nospotlight='sudo mdutil -a -i off'
alias cleardnscache='sudo killall -HUP mDNSResponder'
alias ldd='otool -L'
alias seq='jot - '
alias eject='drutil eject'