スタートアップスクリプトを持っている人もいれば、プロンプトをカスタマイズする人もいます。ある開発者は、頻繁にアクセスする長いパスと頻繁に実行するコマンドに短いエイリアスを使用しています。
生産性と使いやすさを向上させるために、UNIXプロファイルで行ったすべての効果的なカスタマイズは何ですか?
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
再起動後。ただし、これを拡張することは可能です。シェルを終了した後に一時ディレクトリを削除するようにします。
入力する代わりに
cd ../../../..
あなたはただタイプする
up 4
と
cd -
あなたを連れ戻す
関数を.bashrcに入れて使用します。
# (c) 2007 stefan w. GPLv3
function up {
ups=""
for i in $(seq 1 $1)
do
ups=$ups"../"
done
cd $ups
}
前のコマンドの終了コードがゼロ以外の場合、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に入れたものです
.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
(Escapeキーと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
}
また、1つのコマンドをデフォルトで引数として使用する方が簡単な場合があるため(ls、grep、小さなコマンドのように)、多くのエイリアスを編集してから、そのたびにすべてを入力する方がはるかに簡単です。
(コミュニティーWikiなので、各トリックは個別の回答に属しています。)
安全なログアウト
Ctrl+D シェルを終了する最も簡単な方法ですが、ジョブがまだ実行されている場合は、シェルを終了しても問題ありません。デフォルトでは、これは、そのシェルの内部から実行していたすべてのプログラムが強制終了されることを意味します。
一部のシェルはを押した後にのみログアウトできます Ctrl+D 2回ですが、それを誤って行うのはまだ簡単です。
したがって、代わりに、これを.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
コマンドを逆方向に検索します。
これをbash
の/etc/inputrc
または.inputrc
に入れる必要があります。
$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif
zsh
の.zshrc
:
bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward
さらに一歩進んで、上矢印でこれを実行することもできます。
タブ補完の改善
カスタマイズについて誰かが言ったとは思わない 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}'
単純な計算機
$(( ... ))
または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 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
コードは少なくとも部分的に this に基づいています。
履歴設定
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
最後のコマンドのゼロ以外の戻り値を追加することは素晴らしいアイデアです。元の投稿者は特に.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 [」を使用した後。左角かっこが組み込みの場合、$?の値は上書きされません。しかし、[が組み込まれていないシェルを使用すると、$の値がリセットされますか?テスト後。 $を割り当てた方が安全ですか?すぐに一時変数に入れてから、その変数をテストします。
最後に変更されたファイルを表示
多くの場合、最新のファイルを確認します。たとえば、私はログディレクトリにいる可能性があり、何かが機能していない理由を確認する最初の場所であるため、どのファイルが最新であるかを確認する必要があります。
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
そして、ここでは、1行ではなく-<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
}
オートコンプリートとファイル名のスペル修正を有効にできる場合!これはおそらく、最も時間を節約できる2つのことです。次に、それらを使用する方法を学びます-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'
ディレクトリ全体がコマンドラインのright側に表示され、cut-n-pastingの準備が整います。詳細は後ほど。
複数のvim-windowsを1つのファイルにしたり、複数のバッファーを作成したりできるため、適切にコンパイルされた最新の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ディレクティブは、「Word」に「。」、「/」、「*」などを含めます。 「/」で区切られたファイル名の任意の部分をダブルクリックすると、「:」文字を除いた全体が表示されます。
cutToBeginningOfLineは、上記のZsh RPROMPTで動作します。コマンドラインのRHSに表示される現在の作業ディレクトリのパスを3回クリックすると、パスのみを取得します。コピーはWordの先頭で停止します。慣れれば非常に効率的です。
上記のXリソースは、貼り付けキーにもなります。そうすれば、(おそらくマウスを使用して)コピーしたら、手をマウスのところに戻さなくても貼り付けることができます。