スタートアップスクリプトを持っている人もいれば、プロンプトをパーソナライズしている人もいます。ある開発者は、頻繁に訪れる長いパスと頻繁に実行するコマンドに短いエイリアスを使用します。
生産性と使いやすさを向上させるために、UNIXプロファイルで行った効果的なカスタマイズは何ですか?
スタートアップスクリプトを持っている人もいれば、プロンプトをパーソナライズしている人もいます。ある開発者は、頻繁に訪れる長いパスと頻繁に実行するコマンドに短いエイリアスを使用します。
生産性と使いやすさを向上させるために、UNIXプロファイルで行った効果的なカスタマイズは何ですか?
回答:
w!!
。
cmap w!! w !sudo tee % > /dev/null
grep
。
alias grep='grep --color=auto --binary-files=without-match --devices=skip'
cat 1337.sh | webshare
alias webshare='curl -F "sprunge=<-" http://sprunge.us | xclip'
クリップボードの短いURLが返されます。返されたURLに追加?whatever-lang
して、構文を強調表示し、行に番号を付けることができます。
set editing-mode vi
set keymap vi
1つのコマンドでディレクトリとcdを作成します
ほとんどのmkdir
場合、私の次のコマンドはcd <that dir>
です。
これにより、入力の手間が省けます。
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
例えば:
/home/mikel$ mcd somedir
/home/mikel/somedir$
もう1つ便利だと思うのは、使い捨てディレクトリを簡単に作成する方法です。たとえば、プログラムをコンパイルしている場合、またはこのサイトで問題を再現しようとしている場合です。ディレクトリのクリーンアップを忘れることがあります。
# make a temporary directory and cd to it
mtd()
{
local dir
dir=$(mktemp -d)
if test -n "$dir"
then
if test -d "$dir"
then
echo "$dir"
cd "$dir"
else
echo "mktemp directory $dir does not exist"
fi
else
echo "mktemp didn't work"
fi
}
動作を示す:
/home/mikel$ mtd
/tmp/tmp.wsnZjJ2KN6
/tmp/tmp.wsnZjJ2KN6$
/tmp
再起動後にシステムをクリーンアップすることに頼っていますが、これを強化することは可能です。たとえば、シェルを終了した後に一時ディレクトリを削除するなどです。
mcd
長年にわたって自分のバージョンを使用してきましたが、mtd
すぐに追加する予定です。
mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }
。おそらく移植性に欠けていますが、私には十分です。
bashプロンプトに、前のコマンドがゼロ以外の場合の終了コードを表示するのが好きです。また、使用するときにシェルが元気を出してくれるので、少し愚かさを加えました。
smiley() {
RC=$?
[[ ${RC} == 0 ]] && echo ':)' || echo ":( ${RC}"
}
export PS1="\$(smiley) \h [\A] [\W] \$ "
コマンドを実行すると、視覚的なフィードバックが得られます。
:) mycomputer [23:03] [~] $ sh -c 'exit 0'
:) mycomputer [23:03] [~] $ sh -c 'exit 11'
:( 11 mycomputer [23:03] [~] $
編集:これは私が私の〜/ .bashrcに入れたものです
.bashrc
、おそらく。
.zshrc
:
alias l='ls -CF'
alias ll='ls -ClhF'
alias la='ls -CaF'
alias lla='ls -CalhF'
alias l.='ls -CAF --ignore=\*'
alias ll.='ls -CAlhF --ignore=\*'
alias t='tree -C'
PS1=$'%{\e[0;33m%}%m %{\e[32;1m%}%~ %{\e[0;31m%}%#%{\e[m%} '
bindkey '^[[3~' delete-char
export GREP_OPTIONS="--color"
.xmodmaprc
:
clear lock
keycode 9 = Caps_Lock ISO_Next_Group Caps_Lock ISO_Next_Group
keycode 66 = Escape NoSymbol Escape
add lock = Caps_Lock
(エスケープキーとCaps Lockキーを入れ替えます)。
私は端末をよく使うので、bashrcを台無しにします(これにより、学習が速くなり、使用する興味深いものや興味深いツールを学ぶことができます)。私は通常、bashrcで多くの関数を定義しています。例:
アーカイブの抽出:
extract () {
libextract () {
if [ -f "$1" ] ; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) rar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "$1 ne moze biti raspakovan!" ;;
esac
else
echo "$1 nije validan fajl"
fi
}
echo "Unesite putanju do direktorijuma u kome se nalaze arhive: " && read dir && dirprovera && cd $dir
for f in *
do
mkdir ./$f-raspakovano && cd ./$f-raspakovano
libextract ./../$f
cd ./../
done
tipka
}
ファイルとフォルダーの名前を変更します。
frename () {
if [ $# -gt 0 ]
then
dir="$(echo $1)"
dirprovera
cd $dir
for f in *
do
mv "$f" "`echo "$f" | tr -s " " "_" | tr "A-Z" "a-z"`" 2>/dev/null &
done
tipka
else
echo "Upotreba: frename [direktorijum]" >&2
fi
}
大きなファイルをいくつかの小さなファイルに分割するためのこのように:
fsplit () {
if [ $# -gt 1 ]
then
file="$(echo $1)"
SIZE="$(echo $2)"
PREFIX="$(echo $3)"
if [ -z "$PREFIX" ]; then PREFIX="fsplit"; fi
fileprovera
split -d -a 3 -b $SIZE $file "$PREFIX-part-" || echo "Doslo je do greske!"
tipka
else
echo "Upotreba: fsplit [fajl] [velicina] [prefix]
Za velicinu se koriste m (MB), g (GB) ili k (KB) (15m, 650kb, 4.7g...)
Prefiks moze sadrzati brojeve, slova, i crtice (primer: moj_pre-fiks)
Ukoliko ne unesete prefiks isti ce biti dodeljen automatski u sledecem formatu:
fsplit-part-XXX
gde XXX predstavlja broj dela fajla (001, 005, 189...)" >&2
fi
}
また、いくつかの場合(ls、grep、小さなコマンドなど)、デフォルトで引数付きの1つのコマンドを使用してから、すべてを毎回入力する方がはるかに簡単であることがわかったため、多くのエイリアスを編集しました
(コミュニティwiki。したがって、各トリックは個別の回答に属します。)
安全なログアウト
Ctrl+ Dはシェルを終了する最も簡単な方法ですが、まだ実行中のジョブがある場合は、とにかくシェルを終了します。デフォルトでは、これはそのシェル内から実行していたすべてのプログラムが強制終了されることを意味します。
一部のシェルでは、Ctrl+をD2回押してからしかログアウトできませんが、誤ってログアウトするのはまだ簡単です。
代わりに、これを.bashrc
、.zshrc
または任意の構成ファイルに追加します。
alias x='_exit'
# prevent running "exit" if the user is still running jobs in the background
# the user is expected to close the jobs or disown them
_exit()
{
case $- in *m*)
# this way works in bash and zsh
jobs | wc -l | grep -q '^ *0 *$'
if test $? -eq 0
then
command exit "$@"
else
jobs
fi
;;
*)
command exit "$@"
;;
esac
}
(コミュニティwiki。したがって、各トリックは個別の回答に属します。)
コマンドを実行したすべての方法について履歴を検索する
すでにCtrl+ について知っているかもしれませんRが、この方法ははるかにスムーズです。
Alt+ Pを設定して、すでに入力したもので始まるコマンドの履歴を検索します。
たとえば、ls
Alt+ P、Alt+ P、Alt+ P は、すべてのls
コマンドを逆方向に検索します。
あなたは、あなたにこれを置く必要がある/etc/inputrc
か.inputrc
についてbash
。
$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif
そしてこれはあなたの中.zshrc
のためにzsh
:
bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward
さらに一歩進んで、上矢印でこれを行うこともできます。
シンプルな電卓
$(( ... ))
またはexpr ...
を使用して非常に基本的な計算を実行できますが、整数除算を実行します。たとえば、
$ expr 3 / 2
1
$ expr 1.5 \* 2
expr: non-integer argument
より良い方法はを使用することbc
です。
# do some floating point arithmetic
calc()
{
echo "scale=3; $*" | bc
}
その後:
$ calc 3 / 2
1.500
$ calc 1.5 \* 2
3.0
alias py='PYTHONSTARTUP=~/.pythonstartup python'
とfrom math import *;
、そのファイルに。整数除算の問題は未解決のままですが、より複雑な操作にはより使いやすい方法です。
より良いタブ補完
カスタマイズのTab完了についてはまだ誰も言及していないと思います。
これが私が持っているものです。
主なものは次の2つです。
cd <Tab>
ディレクトリのみを提案しますd<Tab>
まだ完了Desktop
します。Downloads
bashの場合:
# custom tab completions
if type complete >/dev/null 2>&1
then
if complete -o >/dev/null 2>&1
then
COMPDEF="-o complete"
else
COMPDEF="-o default"
fi
complete -a alias unalias
complete -d cd pushd popd pd po
complete $COMPDEF -g chgrp 2>/dev/null
complete $COMPDEF -u chown
complete -j fg
complete -j kill
complete $COMPDEF -c command
complete $COMPDEF -c exec
complete $COMPDEF -c man
complete -e printenv
complete -G "*.java" javac
complete -F complete_runner -o nospace -o default nohup 2>/dev/null
complete -F complete_runner -o nospace -o default sudo 2>/dev/null
complete -F complete_services service
# completion function for commands such as sudo that take a
# command as the first argument but should complete the second
# argument as if it was the first
complete_runner()
{
# completing the command name
# $1 = sudo
# $3 = sudo
# $2 = partial command (or complete command but no space was typed)
if test "$1" = "$3"
then
set -- `compgen -c "$2"`
# completing other arguments
else
# $1 = sudo
# $3 = command after sudo (i.e. second word)
# $2 = arguments to command
# use the custom completion as printed by complete -p,
# fall back to filename/bashdefault
local comps
comps=`complete -p "$3" 2>/dev/null`
# "complete -o default -c man" => "-o default -c"
# "" => "-o bashdefault -f"
comps=${comps#complete }
comps=${comps% *}
comps=${comps:--o bashdefault -f}
set -- `compgen $comps "$2"`
fi
COMPREPLY=("$@")
}
# completion function for Red Hat service command
complete_services()
{
OIFS="$IFS"
IFS='
'
local i=0
for file in $(find /etc/init.d/ -type f -name "$2*" -perm -u+rx)
do
file=${file##*/}
COMPREPLY[$i]=$file
i=$(($i + 1))
done
IFS="$OIFS"
}
fi
zshの場合:
# set command completions
compctl -a {,un}alias
compctl -b bindkey
compctl -c command
compctl -/ {c,push,pop}d
compctl -E {print,set,unset}env
#compctl -c exec
compctl -f -x "c[-1,exec]" -c -- exec
compctl -j fg
# no -g according to zshcompctl
#compctl -g {ch}grp
compctl -j kill
compctl -c man
compctl -c nohup
compctl -u {ch}own
compctl -o {set,unset}opt
compctl -f -x "c[-1,sudo]" -c -- sudo
compctl -c {whence,where,which}
compctl -M '' 'm:{a-zA-Z}={A-Za-z}'
# make file name completion case-insensitive
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
安全な圧縮
圧縮プログラムは、デフォルトで元のファイルを削除します。私はそれが好きではありません。
alias gzip='gzip --keep'
alias bzip2='bzip2 --keep'
alias xz='xz --keep'
alias lzma='lzma --keep'
複数行プロンプト
tag() {
TAG="${TAG} [$1]" exec zsh
}
reset_tags() {
TAG='' exec zsh
}
color='green'
if [ "${USER}" = 'root' ]; then
color='red'
fi
export PS1="${TAG} %B%F{yellow} *** %F{blue}%~\
%F{yellow}%(1j.[%j] .)%F{red}%(?..(%?%) )%F{${color}}%n@%m %F{blue}%# %f%b"
export RPS1='%B%F{blue}%D{%Y-%m-%d} %F{green}%D{%H:%M:%S}'
export PS2='%B%F{red}%n@%m%k %B%F{blue}%_> %b%f%k'
unset color
環境変数で「タグ」を表示できます。例:
tag 'DONT SHTUDOWN!!'
reset_tags
コードはこれに少なくとも部分的に基づいています。
履歴設定
dont_log() {
HISTFILE="/dev/null" TAG="${TAG} %B%F{red}[LOGGING DISABLED]" zsh
}
if [ "${HISTFILE}" != '/dev/null' ]; then
# history
export HISTFILE="${HOME}/.zsh/history"
export HISTSIZE="4096"
export SAVEHIST="4096"
# Don't overwrite, append!
setopt APPEND_HISTORY
# Write after each command
# setopt INC_APPEND_HISTORY
# Killer: share history between multiple shells
setopt SHARE_HISTORY
# If I type cd and then cd again, only save the last one
setopt HIST_IGNORE_DUPS
# Even if there are commands inbetween commands that are the same, still only save the last one
setopt HIST_IGNORE_ALL_DUPS
# Pretty Obvious. Right?
setopt HIST_REDUCE_BLANKS
# If a line starts with a space, don't save it.
setopt HIST_IGNORE_SPACE
setopt HIST_NO_STORE
# When using a hist thing, make a newline show the change before executing it.
setopt HIST_VERIFY
# Save the time and how long a command ran
setopt EXTENDED_HISTORY
setopt HIST_SAVE_NO_DUPS
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_FIND_NO_DUPS
fi
オートコンプリートとファイル名のスペル修正をオンにできる場合!それはおそらくあなたの時間を最も節約する二つのことです。次に、それらの使用方法を学びます-BashとZshにはタブ補完機能があります。Kshのエスケープバックスラッシュは非効率的であるため、Kshにはお勧めしません。
私はZshを使用していますが、このようなエイリアスはCshを除くほとんどすべてのシェルで機能します。
alias l='ls -FC --color=tty'
alias ls='ls -FC --color=tty'
alias h=history
alias m=more
alias vi=vim
alias cx='chmod +x'
「ps」のエイリアスがそこにあるように思えますが、「ps」をさまざまな方法で使用していることに気付き、今のところ何も見つかりませんでした。
Zshで、RPROMPT(タイプミスではない!)変数を設定します。
RPROMPT='%d'
ディレクトリ全体がコマンドラインの右側に表示され、カットアンドペーストの準備が整います。それについては後で詳しく説明します。
1つのファイルに複数のvim-windowsと複数のバッファーを含めることができるため、適切にコンパイルされた最新のVimを使用する必要があります。.vimrcには次のようなものが含まれている可能性があります。
set mouse=c
set ml
set mls=5
set nowrap
set nobackup
set nonu
set showmatch
set tabstop=4
set shiftwidth=4
set showmode
set showcmd
set ruler
set notextauto
set laststatus=2
set mps=(:),{:},[:],<:>
set modelines=0
それらの多くは個人的な好みですが、8スペースのタブはコードの可読性を低下させ、それを証明するためにさまざまな研究が行われていると思います。
また、「mouse = c」も重要です。マウスを使用してファイル内を移動しないでください。キーボードから手を離し、マウスに触れてマウスを戻すのは遅いです。「hjkl」カーソル移動、およびその他のキーボードページングとカーソル移動キーを使用します。
X11を使用している場合は、Xtermの構成に対していくつかのことを行う必要があります。これは私の.Xresourcesファイルから出てきます:
XTerm*VT100.scrollBar: true
XTerm*VT100.saveLines: 1000
XTerm*VT100.cutNewLine: false
XTerm*VT100.cutToBeginningOfLine: false
XTerm*VT100.charClass: 33:48,35:48,37:48,42:48,45-47:48,64:48,95:48,126:48
XTerm*VT100*translations: #override \n\
<Key>F2: insert-selection(PRIMARY,CUT_BUFFER0)
デフォルトでXtermにスクロールバーを与え、1000行のテキストをバッファに保存します。これは非常に標準的なことです。
charClassディレクティブは、「単語」に「。」、「/」、「*」などを含めます。「/」で区切られたファイル名の任意の部分をダブルクリックすると、「:」文字を除いた全体が表示されます。
cutToBeginningOfLineは、上記のZsh RPROMPTで動作します。コマンドラインのRHSに表示される現在の作業ディレクトリのパスをトリプルクリックすると、パスのみが選択されます。コピーは単語の先頭で停止します。慣れれば非常に効率的です。
上記のXリソースは、ペーストキーにもなります。そうすれば、コピーした後(おそらくマウスを使用して)、クリックしてマウスに手を戻さずに貼り付けることができます。
Esc``Esc
またはEsc``=
でksh
、でTab
動作しksh93
ます。誰かがそれにこだわっているか、それを好む場合に備えて。
最後のコマンドのゼロ以外の戻り値を追加するのは素晴らしいアイデアです。オリジナルのポスターは.profile / .cshrc / .bashrcについて具体的に尋ねていたと思います。他の一般的にカスタマイズされたRCファイルのリストに言及する価値はありますが、この質問ではシェルのカスタマイズのみに固執します。
また、最近、シェルが画面で実行されているときに表示されるフラグをプロンプトに追加しました。solarisの「ptree」コマンドを使用して祖先プロセスを検索しますが、Linuxで「pstree」コマンドを使用して同じことを行うこともできます。
SCREEN=""
if [ -f /usr/bin/ptree ]; then
if ptree $$ | grep -v grep | grep -w screen > /dev/null 2>&1; then
SCREEN="SCREEN "
fi
fi
最後のコマンドのリターンコードを埋め込む方法を理解するのに数分かかりましたので、ここに投稿します。
PROMPT_COMMAND='if [ "$?" = 0 ]; \
then RC=""; \
else RC="RV=$? "; fi; PS1="% ${SCREEN}\h $RC\w\n% "'
それはもっと美しくできると確信しています。:-)
今後のヒントは、$の読み取りに注意してください。「if [」を使用した後。左括弧が組み込みの場合、$?の値はオーバーライドされません。しかし、[が組み込まれていないシェルを使用すると、$?の値がリセットされます。テスト後。$を割り当てる方が安全ですか?すぐに一時変数に入れて、その変数をテストします。
最後に変更されたファイルを表示する
多くの場合、最新のファイルを見たいと思います。たとえば、私はlogsディレクトリにいて、どのファイルが機能していないのかを調べるための最初の場所であるため、どのファイルが最新であるかを知りたい場合があります。
ls -lt | head
入力するのは面倒ですが、ここに別の方法があります:
# show the most recently changed file
latest()
{
if test $# -ne 0
then
/bin/ls -t -1 -d "$@" | head -n 1
else
/bin/ls -t -1 -d * | head -n 1
fi
}
また、ワイルドカードまたはファイルのリストも受け取ります。たとえば、
$ latest mail* syslog*
syslog
これは、すべてのログファイルの名前にタイムスタンプが含まれている場合に特に便利です。タイムスタンプの形式を気にすることなく、そのプログラムの最新のログを見つけることができます。
$ touch -d 'Feb 1' mylog.20110201
$ touch -d 'Feb 2' mylog.20110202
$ touch -d 'Feb 3' mylog.20110203
$ latest mylog*
mylog.20110203
そして、これは行の代わりに行-<number>
を印刷するオプションをサポートする拡張バージョンです<number>
。
# show the most recently changed file
latest()
{
local count=1 # how many files to print
local promptlines=5 # how many lines to leave for the prompt
# when printing a screenful with -s
local usage="Usage: latest [-n <number>] [-s] [--] [pattern]"
while test $# -gt 0
do
case $1 in
# -- = stop processing options
--)
shift
break
;;
# -n <number> = <number> files
-n)
if test -n "$2"
then
count=$2
shift 2
else
echo "$usage" 1>&2
return 1
fi
;;
# -s = one screenful
-s)
count=$((LINES - promptlines))
shift
;;
# -<number> = <number> files
-[0-9]*)
count=${1#-}
shift
;;
# anything else starting with a minus is a usage error
-*)
echo "$usage" 1>&2
return 1
;;
*)
break
;;
esac
done
if test $# -ne 0
then
/bin/ls -t -1 -d "$@" | head -n $count
else
/bin/ls -t -1 -d * | head -n $count
fi
}