web-dev-qa-db-ja.com

生産性を向上させるために、シェルプロファイルでどのようなカスタマイズを行いましたか?

スタートアップスクリプトを持っている人もいれば、プロンプトをカスタマイズする人もいます。ある開発者は、頻繁にアクセスする長いパスと頻繁に実行するコマンドに短いエイリアスを使用しています。

生産性と使いやすさを向上させるために、UNIXプロファイルで行ったすべての効果的なカスタマイズは何ですか?

25
San

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再起動後。ただし、これを拡張することは可能です。シェルを終了した後に一時ディレクトリを削除するようにします。

7
Mikel

アップN

ディレクトリツリーでN個のディレクトリを上にジャンプ

入力する代わりに

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
}
4
user unknown

前のコマンドの終了コードがゼロ以外の場合、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に入れたものです

4
jsbillings

.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キーを入れ替えます)。

2
polemon

私はターミナルをたくさん使用しているため、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、小さなコマンドのように)、多くのエイリアスを編集してから、そのたびにすべてを入力する方がはるかに簡単です。

1
user2648

(コミュニティー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
}
1
Mikel

(コミュニティー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

さらに一歩進んで、上矢印でこれを実行することもできます。

1
Mikel

タブ補完の改善

カスタマイズについて誰かが言ったとは思わない 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}'
1
Mikel

単純な計算機

$(( ... ))または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
1
Mikel

安全な圧縮

圧縮プログラムは、デフォルトで元のファイルを削除します。嫌いです。

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
  • 現在のディレクトリを別の行に表示します。 80列の端末で深いディレクトリツリーを処理する場合に便利です。
  • グラフィカル環境を使用する場合、隅に時計があることは素晴らしいことです。このプロンプトは時間を示します。残念ながら、更新するにはEnterキーを押す必要があります。
  • 環境変数を使用して「タグ」を表示できます。例:

    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
  • ここ から恥知らずに盗まれた。
  • ロギングを明示的に無効にするサポートを追加しました。パスワードをCLI引数として期待するプログラムを扱う場合に役立ちます。
1
stribika

最後のコマンドのゼロ以外の戻り値を追加することは素晴らしいアイデアです。元の投稿者は特に.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 [」を使用した後。左角かっこが組み込みの場合、$?の値は上書きされません。しかし、[が組み込まれていないシェルを使用すると、$の値がリセットされますか?テスト後。 $を割り当てた方が安全ですか?すぐに一時変数に入れてから、その変数をテストします。

0
Chris Quenelle

最後に変更されたファイルを表示

多くの場合、最新のファイルを確認します。たとえば、私はログディレクトリにいる可能性があり、何かが機能していない理由を確認する最初の場所であるため、どのファイルが最新であるかを確認する必要があります。

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
}
0
Mikel
  • bashrc:私はzshユーザーなので、システムで使用可能な場合、zshを開始するbashrcに数行あります。
  • zshrc:grmlのようなものからzshrcをコピーする代わりに(zshrcはかなり良いので、自分でロールしたくない場合は、おそらく自分のzshrcが最高の1つです)私は自分でzshrcを作成します。
    • カスタマイズされたプロンプトがあります。いくつかの他のものの間で、それはそれが0に等しくなかった場合、最後のコマンドの戻りコードを示します。
    • いくつかのエイリアスがあります。多数のサーバーにアカウントを持っているため、システムで使用可能なコマンドのバージョンを確認し、それに応じてエイリアスを設定する必要がある場合があります。
    • PATH変数を設定しました。
    • 他のいくつかの環境変数を設定します(たとえば、$ EDITOR)
  • vimrc:私はvimユーザーなので、カスタマイズした配色とカスタマイズした配色を使用しています。
  • screenrc:私はGNU screenを使用して、複数の端末を開いたり、ログインしていないときに履歴を保持したりする必要がないようにしています。そのため、独自のscreenrcを使用しています。
0
Christoph Wurm

オートコンプリートとファイル名のスペル修正を有効にできる場合!これはおそらく、最も時間を節約できる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リソースは、貼り付けキーにもなります。そうすれば、(おそらくマウスを使用して)コピーしたら、手をマウスのところに戻さなくても貼り付けることができます。

0
Bruce Ediger