Những tùy chỉnh nào bạn đã thực hiện trên hồ sơ shell của bạn để tăng năng suất?


25

Tôi biết một số người có một số tập lệnh khởi động và một số người cá nhân hóa lời nhắc. Một nhà phát triển sử dụng các bí danh ngắn cho con đường dài anh ta thường truy cập và các lệnh thường xuyên anh ta chạy.

Tất cả các tùy chỉnh hiệu quả bạn đã thực hiện trên hồ sơ UNIX của bạn để tăng năng suất và dễ sử dụng là gì?


nên được CW, không thể được trả lời khách quan.
akira

Tôi đồng ý. Tuy nhiên, không có tùy chọn cho CW. :-(
San

@akira @Michael Tôi thường xuyên phải đối mặt với tình huống này. Sẽ thật tuyệt nếu người điều hành có thể chỉnh sửa / đăng chéo / chuyển hướng câu hỏi. Bởi vì nhận xét bạn để lại không giúp người dùng nhiều để đạt được những gì anh ta thực sự muốn. Không xúc phạm, chỉ là một đề nghị. Mong là bạn hiểu.
San

Nếu bạn muốn tạo một wiki cộng đồng câu hỏi, hãy gắn cờ cho sự chú ý của người điều hành. Xem Câu hỏi thường gặp về wiki cộng đồng .
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


11

.vimrc

lưu tập tin với quyền root bằng cách gõ w!!:

cmap w!! w !sudo tee % > /dev/null


.bashrc

Đừng bận tâm với các thiết bị hoặc tệp nhị phân khi greping:

alias grep='grep --color=auto --binary-files=without-match --devices=skip'


Chia sẻ mã trên web (như pastebin, nhưng đơn giản hơn) bằng cách cat 1337.sh | webshare

alias webshare='curl -F "sprunge=<-" http://sprunge.us | xclip'

Nó trả lại một url ngắn trong clipboard của bạn; bạn có thể nối ?whatever-langvào URL được trả về để cú pháp được tô sáng và đánh số dòng.


.inputrc

Sử dụng chế độ vi trong mọi thứ sử dụng thư viện readline (nhiều chương trình):

set editing-mode vi
set keymap vi

Những lời khuyên tuyệt vời mà tôi không bao giờ biết.
San

7

tạo một thư mục và cd trong một lệnh

Hầu hết thời gian tôi làm mkdir, lệnh tiếp theo của tôi là cd <that dir>.

Điều này tiết kiệm một số gõ:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

ví dụ:

/home/mikel$ mcd somedir
/home/mikel/somedir$ 

Một điều nữa tôi thấy hữu ích là một cách dễ dàng để tạo một thư mục vứt đi. ví dụ: nếu tôi đang biên dịch một chương trình hoặc ngay cả khi tôi đang cố gắng tái tạo một vấn đề trên trang web này. Đôi khi tôi có thể quên dọn dẹp thư mục.

# 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
}

cho thấy nó hoạt động:

/home/mikel$ mtd
/tmp/tmp.wsnZjJ2KN6
/tmp/tmp.wsnZjJ2KN6$ 

Tôi đang dựa vào hệ thống dọn dẹp /tmpsau khi khởi động lại, nhưng có thể tăng cường điều này, ví dụ như làm cho nó xóa thư mục tạm thời sau khi thoát khỏi trình bao.


Tôi thích tùy chọn mcd. Đẹp một, Cảm ơn.
San

+1 Tôi đã sử dụng phiên bản của mình mcdtrong nhiều năm và sẽ sớm thêm một cái gì đó như thế mtd.
maaartinus

Tôi xác định của tôi mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }. Nó có thể thiếu tính di động, nhưng nó đủ tốt cho tôi.
maaartinus

4

Tôi muốn có dấu nhắc bash của tôi hiển thị mã thoát của lệnh trước nếu nó khác không. Tôi cũng thích cái vỏ của mình để cổ vũ tôi khi tôi sử dụng nó, vì vậy tôi đã thêm một chút silliness:

smiley() {
    RC=$?
    [[ ${RC} == 0 ]] && echo ':)' || echo ":( ${RC}"
}

export PS1="\$(smiley) \h [\A] [\W] \$ "

Vì vậy, khi tôi chạy các lệnh, tôi nhận được một số phản hồi trực quan tốt đẹp:

:) mycomputer [23:03] [~] $ sh -c 'exit 0'
:) mycomputer [23:03] [~] $ sh -c 'exit 11'
:( 11 mycomputer [23:03] [~] $ 

chỉnh sửa : đây là thứ tôi đặt trong ~ / .bashrc


Khá thú vị. Nhưng, tôi có một nghi ngờ. Mã cư trú ở đâu?
San

Trong .bashrclẽ.
Mikel

vâng, đó là trong ~ / .bashrc của tôi
jsbillings

Sẽ thử điều đó ..
San

4

lên N

nhảy N thư mục lên trong cây thư mục

Thay vì gõ

cd ../../../..

bạn chỉ cần gõ

up 4

và một

cd -    

sẽ mang bạn trở lại

Đặt hàm vào .bashrc của bạn để sử dụng nó.

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}

Wow .. đó là một ý tưởng hay ..
San

2

.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

(Hoán đổi phím Escape và Caps Lock).


+1 để ánh xạ lại các phím, Caps Lock của tôi được ánh xạ trở lại, AI CẦN CAPS KHÓA NÀO?
vẫy

1
Tôi là người dùng Vim. Đó là điển hình cho người dùng Vim, để ánh xạ Escape sang Caps Lock. Người dùng Emacs có xu hướng ánh xạ Control tới Caps Lock.
Polemon

1

Tôi gặp rắc rối với bashrc của mình vì tôi sử dụng thiết bị đầu cuối rất nhiều (nó khiến tôi học nhanh và học những thứ thú vị để sử dụng cũng như các công cụ thú vị). Tôi thường định nghĩa rất nhiều hàm trong bashrc của mình. Ví dụ:

Trích xuất tài liệu lưu trữ:

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
}

đổi tên tập tin và thư mục:

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
}

và như thế này để chia các tệp lớn thành nhiều tệp nhỏ:

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
}

Ngoài ra tôi đã chỉnh sửa rất nhiều bí danh vì tôi thấy rằng việc sử dụng một lệnh với các đối số là mặc định trong một số trường hợp (như trong ls, grep và các lệnh nhỏ) sẽ dễ dàng hơn rất nhiều mỗi lần.


1

(Wiki cộng đồng, vì vậy mỗi thủ thuật thuộc về một câu trả lời riêng.)

đăng xuất an toàn

Ctrl+ Dlà cách dễ nhất để thoát khỏi shell, nhưng nếu bạn vẫn có công việc đang chạy, nó sẽ vui vẻ thoát khỏi shell. Theo mặc định, điều này có nghĩa là tất cả các chương trình bạn đang chạy từ bên trong lớp vỏ đó sẽ bị giết.

Một số shell sẽ chỉ cho phép bạn đăng xuất sau khi nhấn Ctrl+ Dhai lần, nhưng vẫn quá dễ dàng để làm điều đó một cách tình cờ.

Vì vậy, thay vào đó, thêm video này vào .bashrchoặc .zshrchoặc bất cứ tập tin cấu hình mà bạn thích.

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

(Wiki cộng đồng, vì vậy mỗi thủ thuật thuộc về một câu trả lời riêng.)

tìm kiếm lịch sử của bạn cho tất cả các cách bạn chạy một lệnh

Bạn có thể đã biết về Ctrl+ R, nhưng cách này IMHO mượt mà hơn nhiều.

Thiết lập Alt+ Pđể tìm kiếm lịch sử cho các lệnh bắt đầu với những gì bạn đã nhập.

ví dụ ls Alt+ P, Alt+ P, Alt+ P sẽ tìm kiếm ngược thông qua tất cả các lslệnh của bạn .

Bạn cần đặt cái này trong /etc/inputrchoặc .inputrccho bash:

$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif

và cái này trong của bạn .zshrccho zsh:

bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward

Bạn thậm chí có thể tiến thêm một bước và làm cho mũi tên Lên làm điều này.


1

máy tính đơn giản

Bạn có thể sử dụng $(( ... ))hoặc expr ...thực hiện các phép tính rất cơ bản, nhưng nó thực hiện phép chia số nguyên, vd

$ expr 3 / 2
1

$ expr 1.5 \* 2
expr: non-integer argument

Một cách tốt hơn là sử dụng bc.

# do some floating point arithmetic
calc()
{
    echo "scale=3; $*" | bc
}

sau đó:

$ calc 3 / 2
1.500
$ calc 1.5 \* 2
3.0

1
Máy tính của tôi là alias py='PYTHONSTARTUP=~/.pythonstartup python'với from math import *;trong tập tin đó. Vấn đề phân chia số nguyên vẫn chưa được giải quyết, nhưng nó có thể sử dụng nhiều hơn cho các hoạt động phức tạp hơn.
maaartinus

1

hoàn thành tab tốt hơn

Tôi không nghĩ có ai đề cập đến Tabviệc hoàn thành tùy chỉnh chưa.

Đây là những gì tôi có.

Hai điều chính nó làm là:

  • mỗi lệnh sẽ hoàn thành tab tùy thuộc vào những gì lệnh đang mong đợi,
    ví dụ như cd <Tab>sẽ chỉ đề xuất các thư mục
  • bỏ qua trường hợp,
    ví dụ như d<Tab>vẫn sẽ hoàn thành DesktopDownloads

Đối với 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

Đối với 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

Nén an toàn

Các chương trình nén xóa tập tin gốc theo mặc định. Tôi không thích điều đó.

alias gzip='gzip --keep'
alias bzip2='bzip2 --keep'
alias xz='xz --keep'
alias lzma='lzma --keep'

Dấu nhắc nhiều dòng

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
  • Hiển thị thư mục hiện tại trong một dòng riêng biệt. Hữu ích khi xử lý cây thư mục sâu trên thiết bị đầu cuối 80 cột.
  • Có một chiếc đồng hồ ở góc là một điều tuyệt vời nếu bạn sử dụng môi trường đồ họa. Lời nhắc này hiển thị thời gian. Thật không may, bạn phải nhấn enter để cập nhật nó.
  • Bạn có thể hiển thị "thẻ" với các biến môi trường. Thí dụ:

    tag 'DONT SHTUDOWN!!'
    reset_tags
    
  • Mã ít nhất là một phần dựa trên điều này .

Cài đặt lịch sử

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
  • Không biết xấu hổ bị đánh cắp từ đây .
  • Tôi đã thêm hỗ trợ để vô hiệu hóa đăng nhập. Hữu ích nếu bạn đang xử lý các chương trình mong đợi mật khẩu là đối số CLI.

0
  • bashrc : Tôi là người dùng zsh, vì vậy tôi có một vài dòng trong bashrc bắt đầu zsh nếu nó có sẵn trên hệ thống.
  • zshrc : Thay vì sao chép zshrc của tôi từ một cái gì đó như grml (mặc dù zshrc khá tốt, vì vậy nếu bạn không muốn tự mình tạo ra thì có lẽ là một trong những điều tốt nhất) Tôi viết zshrc của riêng tôi.
    • Tôi có một dấu nhắc tùy chỉnh. Trong số một số thứ khác, nó hiển thị mã trả về của lệnh cuối cùng nếu nó không bằng 0.
    • Tôi có một số bí danh. Vì tôi có tài khoản trên khá nhiều máy chủ nên đôi khi tôi phải thực hiện kiểm tra xem phiên bản lệnh nào có sẵn trên hệ thống và đặt bí danh cho phù hợp.
    • Tôi đặt biến PATH của mình.
    • Tôi đặt một số biến môi trường khác (ví dụ $ EDITOR)
  • vimrc : Tôi là người dùng vim, vì vậy tôi có một bảng màu tùy chỉnh và tùy chỉnh.
  • screenrc : Tôi sử dụng màn hình GNU để tránh phải mở nhiều thiết bị đầu cuối và để lưu lại lịch sử trong khi không đăng nhập, vì vậy tôi có screenrc riêng.

0

Nếu bạn có thể BẮT ĐẦU TỰ ĐỘNG VÀ TÊN TÊN GỌI TÊN GỌI! Đó có lẽ là hai điều sẽ giúp bạn tiết kiệm thời gian nhất. Sau đó, học cách sử dụng chúng - Bash và Zsh đã hoàn thành tab. Ksh có dấu gạch chéo thoát không hiệu quả, vì vậy tôi khuyên bạn nên chống lại Ksh.

Tôi sử dụng Zsh, nhưng các bí danh như thế này sẽ hoạt động trong hầu hết mọi shell ngoại trừ 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'

Có vẻ như là một bí danh cho 'ps' nên ở đó, nhưng tôi thấy mình sử dụng 'ps' theo nhiều cách khác nhau và cho đến nay tôi chưa tìm thấy gì.

Trong Zsh, hãy thiết lập biến RPROMPT (không phải lỗi chính tả!) Của bạn:

RPROMPT='%d'

Toàn bộ thư mục xuất hiện ở bên phải của dòng lệnh, sẵn sàng để cắt-dán. Thêm về điều đó sau.

Bạn nên sử dụng một Vim hiện đại được biên dịch đúng, vì khả năng có nhiều cửa sổ vim vào một tệp và nhiều bộ đệm. .Vimrc của bạn có thể có những thứ như thế này trong đó:

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

Rất nhiều trong số đó là sở thích cá nhân, nhưng tôi thực sự tin rằng các tab 8 không gian làm cho mã ít đọc hơn và có một nghiên cứu nổi xung quanh để chứng minh điều đó.

Ngoài ra, "mouse = c" rất quan trọng. Bạn không nên sử dụng chuột để di chuyển trong tập tin. Bỏ tay ra khỏi bàn phím, chạm vào chuột và chúng di chuyển chúng trở lại thật chậm. Sử dụng chuyển động con trỏ "hjkl" và các phím di chuyển bàn phím và con trỏ khác.

Nếu bạn đang sử dụng X11, bạn nên thực hiện một số điều với cấu hình Xterm của mình. Điều này xuất phát từ tệp .Xresource của tôi:

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)

Đặt mặc định cho Xterm một thanh cuộn, lưu 1000 dòng văn bản trong bộ đệm, đó là tiêu chuẩn khá.

Lệnh charClass tạo ra một "từ" bao gồm những thứ như '.', '/' Và '*'. Nhấp đúp vào bất kỳ phần nào của '/' - tên tệp được phân tách và bạn nhận được toàn bộ, ít ký tự ':'.

cutToBeginningOfLine hoạt động với Zsh RPROMPT ở trên. Nhấp ba lần vào đường dẫn của thư mục làm việc hiện tại xuất hiện trên RHS của dòng lệnh của bạn và bạn chỉ chọn đường dẫn: bản sao dừng ở đầu từ. Hiệu quả cao một khi bạn đã quen với nó.

Các tài nguyên X ở trên cũng làm cho một khóa dán. Bằng cách đó, khi bạn đã sao chép (có thể sử dụng chuột), bạn có thể dán mà không cần di chuyển bàn tay trở lại chuột để nhấp.


FWIW, hoàn thành tên tệp là Esc``Eschoặc Esc``=trong kshTabhoạt động trong ksh93. Chỉ trong trường hợp bất cứ ai bị mắc kẹt với nó hoặc thích nó.
Mikel

0

Thêm giá trị trả về khác không của lệnh cuối cùng là một ý tưởng tuyệt vời. Tôi nghĩ rằng poster ban đầu được hỏi cụ thể về .profile / .cshrc / .bashrc. Đáng để đề cập đến danh sách các tệp RC thường được tùy chỉnh khác, nhưng tôi sẽ chỉ sử dụng các tùy chỉnh shell cho câu hỏi này.

Gần đây tôi cũng đã thêm một lá cờ trong lời nhắc của mình xuất hiện khi shell đang chạy dưới màn hình. Nó sử dụng lệnh "ptree" của solaris để tìm kiếm các tiến trình của tổ tiên, nhưng bạn có thể sử dụng lệnh "pstree" trên Linux để làm điều tương tự.

SCREEN=""
if [ -f /usr/bin/ptree ]; then
   if ptree $$ | grep -v grep | grep -w screen > /dev/null 2>&1; then
       SCREEN="SCREEN "
   fi
fi

Tôi mất vài phút để tìm ra cách nhúng mã trả về của lệnh cuối cùng, vì vậy tôi sẽ đăng nó ở đây.

PROMPT_COMMAND='if [ "$?" = 0 ]; \
        then RC=""; \
        else RC="RV=$? "; fi; PS1="% ${SCREEN}\h $RC\w\n% "'

Tôi chắc chắn rằng nó có thể được làm đẹp hơn. :-)

Mẹo trong tương lai, hãy cẩn thận về việc đọc $? sau khi sử dụng "nếu [". Nếu dấu ngoặc trái là tích hợp sẵn, nó sẽ không ghi đè giá trị của $?. Nhưng nếu bạn sử dụng shell trong đó [không được tích hợp sẵn thì nó sẽ đặt lại giá trị của $? sau khi thử nghiệm Chỉ định $ an toàn hơn? vào một biến tạm thời ngay lập tức và sau đó kiểm tra biến đó.


Câu trả lời của bạn có lẽ nên là một bình luận ... Thích cái này!
VxJasonxV

0

hiển thị tập tin thay đổi gần đây nhất

Thông thường, tôi muốn xem tập tin gần đây nhất. ví dụ: tôi có thể đang ở trong thư mục bản ghi và muốn xem tệp nào gần đây nhất vì đó là nơi đầu tiên để xem tại sao một cái gì đó không hoạt động.

ls -lt | head là một loại nhưng cồng kềnh để gõ, vì vậy đây là một thay thế:

# 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
}

Nó cũng mất một ký tự đại diện hoặc danh sách các tập tin, ví dụ

$ latest mail* syslog*
syslog

Điều này đặc biệt hữu ích nếu tất cả các tệp nhật ký của bạn có dấu thời gian trong tên của chúng. Bạn có thể tìm thấy nhật ký mới nhất cho chương trình đó mà không phải lo lắng định dạng dấu thời gian ở định dạng nào.

$ touch -d 'Feb 1' mylog.20110201
$ touch -d 'Feb 2' mylog.20110202
$ touch -d 'Feb 3' mylog.20110203
$ latest mylog*
mylog.20110203

Và đây là phiên bản mở rộng hỗ trợ -<number>tùy chọn in <number>các dòng thay vì một dòng.

# 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.