Verimliliği artırmak için kabuk profilinizde hangi özelleştirmeleri yaptınız?


25

Bazı insanların bazı başlangıç ​​komut dosyaları olduğunu ve bazılarının da istemi kişiselleştirdiğini biliyorum. Bir geliştirici, sık ziyaret ettiği uzun yol ve çalıştırdığı sık komutlar için kısa takma adları kullanır.

Verimliliği ve kullanım kolaylığını artırmak için UNIX profilinizde yaptığınız tüm etkili kişiselleştirmeler nelerdir?


CW olmalı, objektif olarak cevaplanamaz.
akira

Katılıyorum. Ancak, CW için seçenek yoktu. :-(
San

@akira @Michael Bu durumla sık sık karşılaşıyorum. Yöneticilerin soruyu düzenleyebilmesi / çapraz gönderebilmesi / yönlendirebilmesi harika olurdu. Çünkü bıraktığınız yorum gerçekten istediğini elde etmek için kullanıcıya pek yardımcı olmuyor. Alınma, sadece bir öneri. Umarım anlarsın.
San

Bir soru topluluğu topluluğu wiki yapmak istiyorsanız, yöneticiyi dikkat çekmek için işaretleyin. Topluluk wiki SSS bölümüne bakın .
Gilles 'SO- kötülük' dur '29

Yanıtlar:


11

.vimrc

yazarak kök izinleriyle dosyayı kaydedin w!!:

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


Bashrc

Aşağıdakileri yaparken aygıtlarla veya ikili dosyalarla uğraşmayın grep:

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


Web’de paylaşın kodu (pastebin gibi, ancak daha basit) cat 1337.sh | webshare

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

Panonuza kısa bir URL geri verir ; Eğer yapabilirsiniz eklemek ?whatever-langdöndürülen URL'ye vurgulanır ve çizgiler sayılı sözdizimini olması.


.inputrc

Vi satırını, readline kütüphanesini kullanan her şeyde kullanın (birçok program):

set editing-mode vi
set keymap vi

Hiç bilmediğim harika ipuçları.
San

7

tek bir komutta bir dizin ve cd yapmak

Yaptığım çoğu zaman mkdir, bir sonraki komutum cd <that dir>.

Bu bazı yazarak kaydeder:

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

Örneğin:

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

Yararlı bulduğum bir diğer şey, bir fırlatma dizini oluşturmanın kolay bir yoludur. Örneğin, bir programı derliyorsam ya da bu sitede bir sorun oluşturmaya çalışsam bile. Bazen dizini temizlemeyi unutabilirim.

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

çalışma gösteriliyor:

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

/tmpBir yeniden başlatma işleminden sonra sistemin temizlenmesine güveniyorum , ancak bunu geliştirmek mümkün olabilir, örneğin kabuktan çıktıktan sonra geçici dizini siler.


Mcd seçeneğini sevdim. Güzel olan, teşekkürler.
San

+1 Sürümümü mcduzun yıllardır kullanıyorum ve mtdyakında olduğu gibi bir şeyler ekleyeceğim .
maaartinus

Ben tanımladım mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }. Muhtemelen bir taşınabilirlikten yoksundur, ama benim için yeterince iyi.
maaartinus

4

Bash istemimin sıfır değilse, önceki komutun çıkış kodunu göstermesini istiyorum. Ben de kullandığımda beni neşelendirmek için kabuğumu seviyorum, bu yüzden biraz terilik ekledim:

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

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

bu yüzden komutları çalıştırdığımda, bazı güzel görsel geri bildirim alıyorum:

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

düzenleme : bu benim ~ / .bashrc içine koymak bir şey


Oldukça ilginç. Ama bir şüphem var. Kod nerede bulunmalıdır?
San

In .bashrcmuhtemelen.
Mikel

evet, bu benim ~ / .bashrc
jsbillings

Bunu deneyeceğim ..
San

4

yukarı N

dizin ağacında N dizinleri yukarı zıpla

Yazmak yerine

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

sen sadece yaz

up 4

ve bir

cd -    

seni geri getireceğim

Fonksiyonu kullanmak için .bashrc içine yerleştirin.

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

Vay .. bu güzel bir fikir ..
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

(Takas Escape ve Caps Lock tuşları).


Tuşları yeniden eşleştirmek için +1, Caps Lock'um Return ile eşleştirildi, KİMLER KİLİT EDİYOR?
wag

1
Ben bir Vim kullanıcısıyım. Escape to Caps Lock'un haritasını çıkarmak Vim kullanıcıları için tipiktir. Emacs kullanıcısı, Control to Caps Lock'u eşleme eğilimindedir.
polemon

1

Terminal'i çok kullandığımdan beri bashrc ile uğraşıyorum (bu beni hızlı ve daha ilginç aletlerin yanı sıra, ilginç araçları da öğrenmemi sağlıyor). Genelde bashrc'mde birçok fonksiyon tanımlarım. Örnekler:

Arşivleri çıkart:

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
}

dosya ve klasörleri yeniden adlandır:

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
}

ve bunun gibi büyük dosyaları birkaç küçük dosyaya bölmek için:

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
}

Ayrıca, birçok durumda diğer adları da düzenlemiştim, çünkü bazı durumlarda varsayılan olarak argümanlarla bir komutu kullanmanın (ls, grep ve küçük komutlarda olduğu gibi) sonra her şeyi yazmanın daha kolay olduğunu öğrendim.


1

(Topluluk wiki, bu yüzden her numara ayrı bir cevaba aittir.)

güvenli oturum kapatma

Ctrl+ D, kabuktan çıkmanın en kolay yoludur, ancak hala çalışan işler varsa, yine de kabuktan çıkacaktır. Varsayılan olarak, bu, kabuğun içinden çalıştırdığınız tüm programların öldürüleceği anlamına gelir.

Bazı mermiler sadece Ctrl+ tuşuna Diki defa bastıktan sonra çıkış yapmanıza izin verir , ancak bunu yanlışlıkla yapmak çok kolaydır.

Bunun yerine, bunu .bashrcveya .zshrctercih ettiğiniz yapılandırma dosyasına ekleyin .

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

(Topluluk wiki, bu yüzden her numara ayrı bir cevaba aittir.)

Komutu çalıştırdığın tüm yollar için geçmişini araştır

Zaten Ctrl+ hakkında bir şey biliyor olabilirsiniz R, ancak bu yol IMHO için daha yumuşak.

Önceden yazdıklarınızla başlayan komutları aramak için Alt+ ayarını yapın P.

örneğin, ls Alt+ P, Alt+ P, Alt+ P tüm lskomutlarınızdan geriye doğru arama yapacaktır .

Eğer bu koymak gerekir /etc/inputrcya .inputrciçin bash:

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

ve bunun .zshrciçin de zsh:

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

Bir adım daha ileri gidebilir ve Yukarı okunun bunu yapmasını sağlayabilirsiniz.


1

basit hesap

Çok temel hesaplamaları kullanabilir $(( ... ))veya expr ...yapabilirsiniz, ancak tamsayılı bölme yapar, örneğin

$ expr 3 / 2
1

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

Daha iyi bir yol kullanmaktır bc.

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

sonra:

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

1
Benim hesap makinesi alias py='PYTHONSTARTUP=~/.pythonstartup python'ile from math import *;bu dosyada. Tamsayılı bölme problemi çözülmedi, ancak daha karmaşık işlemler için daha kullanışlı.
maaartinus

1

daha iyi sekme tamamlama

TabHenüz kimsenin kişiselleştirmeyi tamamladığından bahsettiğini sanmıyorum .

İşte elimde ne var.

Yaptığı iki ana şey:

  • Her komut, komutun ne beklediğine bağlı olarak tamamlanır,
    örneğin cd <Tab>sadece dizinleri önerir.
  • görmezden gelin,
    örneğin d<Tab>yine de tamamlanacak DesktopveDownloads

Bash için:

# 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 için:

# 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

Güvenli sıkıştırma

Sıkıştırma programları, orijinal dosyayı varsayılan olarak siler. Bundan hoşlanmadım.

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

Çok satırlı istemi

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
  • Geçerli dizini ayrı bir satırda gösterir. 80 sütunlu bir terminalde derin bir dizin ağacı kullanırken kullanışlıdır.
  • Grafiksel bir ortam kullanıyorsanız köşede bir saat olması harika bir şey. Bu bilgi istemi zamanı gösterir. Maalesef güncellemek için enter tuşuna basmanız gerekiyor.
  • Ortam değişkenleriyle "etiket" görüntüleyebilirsiniz. Örnek:

    tag 'DONT SHTUDOWN!!'
    reset_tags
  • Kod en azından kısmen temel alınarak, bu .

Geçmiş ayarları

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
  • Utanmadan çalındı buradan .
  • Günlük kaydını açıkça devre dışı bırakmak için destek ekledim. Bir CLI argümanı olarak şifreleri bekleyen programlarla uğraşıyorsanız kullanışlıdır.

0
  • bashrc : Ben bir zsh kullanıcısıyım, bu yüzden bir sistemde mevcutsa, bashrc'imde zsh'yi başlatan birkaç satırım var.
  • zshrc : zshrc'imi grml gibi bir şeyden kopyalamak yerine (zshrc oldukça iyi olsa da, kendi yuvarlamanızı istemiyorsanız büyük olasılıkla en iyilerinden biri).
    • Özelleştirilmiş bir istemim var. Diğer bazı şeylerin arasında, eğer 0'a eşit değilse, son komutun dönüş kodunu gösterir.
    • Bazı takma isimlerim var. Oldukça fazla sayıda sunucuda hesabım olduğu için, bazen sistemde bir komut sürümünün mevcut olup olmadığını kontrol etmek ve takma adı buna göre ayarlamak zorunda kalıyorum.
    • PATH değişkenimi ayarladım.
    • Diğer bazı ortam değişkenlerini ayarlıyorum (örneğin $ EDITOR)
  • vimrc : Ben bir vim kullanıcısıyım, bu yüzden özelleştirilmiş ve özelleştirilmiş bir renk düzenim var.
  • screenrc : Birden fazla terminal açmak zorunda kalmamak ve giriş yapmadığım zamanlarda geçmişi korumak için GNU ekranını kullanıyorum, bu yüzden kendi screenrc'im var.

0

OTOMOMPLETE VE DOSYA ADI AÇMA DÜZELTME AÇABİLİRSİNİZ! Muhtemelen seni en çok kurtarabilecek iki şey. Ardından, onları kullanmayı öğrenin - Bash ve Zsh sekmesi tamamladı. Ksh verimsiz bir kaçış ters eğik çizgisine sahip, bu yüzden Ksh a tavsiye ederim.

Zsh kullanıyorum, ancak bunun gibi takma adlar Csh hariç neredeyse tüm kabuklarda işe yarayacak:

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'

Öyle görünüyor ki 'ps' için bir takma ad var olmalı, ama kendimi 'ps' yi çok çeşitli şekillerde kullanırken buluyorum ve şu ana kadar hiçbir şey bulamadım.

Zsh içinde, RPROMPT (bir yazım hatası değil!) Değişkeninizi ayarlayın:

RPROMPT='%d'

Dizinin tamamı komut satırının sağ tarafında, kesim yapıştırma için hazır olarak görünür . Bundan sonra daha fazlası.

Düzgün bir şekilde derlenmiş modern bir Vim kullanmalısınız, çünkü bir dosyada çoklu vim pencereleri ve çoklu tamponlar olabilir. .Vimrc'nizde bunun gibi şeyler olabilir:

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

Bunların çoğu kişisel tercihtir, ancak 8 boşluklu sekmelerin kodu daha az okunabilir hale getirdiğine ve bunu ispatlamak için etrafta dolaşan bir çalışma olduğuna inanıyorum.

Ayrıca, "fare = c" önemlidir. Bir dosyanın içinde hareket etmek için farenizi kullanmamalısınız. Ellerinizi klavyeden çıkarmak, fareye dokunmak ve onları geri hareket ettirmek yavaştır. "Hjkl" imleç hareketini ve diğer klavye çağrı ve imleç hareket tuşlarını kullanın.

X11 kullanıyorsanız, Xterm yapılandırmanıza birkaç şey yapmanız gerekir. Bu .Xresources dosyamdan çıkıyor:

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'e varsayılan olarak bir kaydırma çubuğu verin, arabellekte 1000 satır metin kaydedin, bu oldukça standart.

CharClass yönergesi bir "kelime" yapar ve ".", "/" Ve "*" gibi şeyleri içerir. '/' İle ayrılmış bir dosya adının herhangi bir bölümünü çift tıkladığınızda, her şeyi elde edersiniz, daha az ':' karakter.

cutToBeginningOfLine, yukarıdaki Zsh RPROMPT ile çalışır. Komut satırınızın RHS'sinde görünen geçerli çalışma dizininin yolunu üç kere tıklayın ve sadece yolu seçersiniz: kopya kelimenin başında durur. Alışınca çok verimli.

Yukarıdaki X kaynakları da yapıştırma anahtarı yapar. Bu şekilde, bir kere kopyaladıysanız (muhtemelen fareyi kullanarak), tıklamak için elinizi tekrar fareye getirmeden yapıştırabilirsiniz.


FWIW, dosya adının tamamlanması Esc``Escya da Esc``=içinde kshve içinde Tabçalışıyor ksh93. Sadece birinin takılıp kalması ya da tercih etmesi durumunda.
Mikel

0

Son komutun sıfır olmayan dönüş değerini eklemek harika bir fikirdir. Bence orijinal poster özellikle .profile / .cshrc / .bashrc hakkında soruyordu. Diğer yaygın olarak özelleştirilmiş RC dosyalarının listesinden bahsetmeye değer, ancak bu soru için sadece özelleştirme kabuklarına sadık kalacağım.

Ayrıca son zamanlarda kabuğun ekranın altında çalıştığını belirten istemime bir bayrak ekledim. Ata işlemlerini aramak için solaris "ptree" komutunu kullanır, ancak aynı şeyi yapmak için Linux'taki "pstree" komutunu kullanabilirsiniz.

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

Son komutun dönüş kodunun nasıl yerleştirileceğini bulmam birkaç dakika sürdü, bu yüzden buraya göndereceğim.

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

Bunun daha güzel yapılabileceğine eminim. :-)

Gelecek ipucu, $ okumaya dikkat edin? "if [" kullandıktan sonra. Sol parantez yerleşik ise $? Değerini geçersiz kılmaz. Ancak [yerleşik olmayan bir kabuk kullanırsanız, o zaman $? testten sonra. $ Atamak daha mı güvenli? hemen geçici bir değişkenin içine ve sonra bu değişkeni test edin.


Cevabınız muhtemelen bir yorum olmalı ... Bunun gibi!
VxJasonxV

0

en son değiştirilen dosyayı göster

Genellikle, en yeni dosyaya bakmak istiyorum. örneğin, günlükler dizininde olabilirim ve hangi dosyanın en yeni olduğunu görmek isteyebilirim, çünkü bir şeyin neden çalışmadığını görmek için bakılacak ilk yer burasıdır.

ls -lt | head yazmak için ama hantal, bu yüzden burada bir alternatif:

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

Aynı zamanda, örneğin bir joker karakter veya dosya listesi alır.

$ latest mail* syslog*
syslog

tüm günlük dosyalarınızın adlarında bir zaman damgası varsa, özellikle kullanışlıdır. Bu programın en son günlüğünü, zaman damgasının biçiminde endişelenmeden bulabilirsiniz.

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

Ve işte bir satır yerine satır -<number>yazdırma seçeneğini destekleyen genişletilmiş bir sürüm <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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.