Kustomisasi apa yang telah Anda lakukan pada profil shell Anda untuk meningkatkan produktivitas?


25

Saya tahu beberapa orang memiliki beberapa skrip startup dan beberapa orang mempersonalisasi prompt. Satu pengembang menggunakan alias pendek untuk jalur panjang yang sering dia kunjungi dan perintah yang sering dia jalankan.

Apa saja kustomisasi efektif yang telah Anda lakukan pada profil UNIX Anda untuk meningkatkan produktivitas dan kemudahan penggunaan?


harus CW, tidak bisa dijawab secara objektif.
akira

Saya setuju. Namun, tidak ada opsi untuk CW. :-(
San

@akira @Michael Saya sering menghadapi situasi ini. Akan lebih bagus jika moderator dapat mengedit / mengirim silang / mengalihkan pertanyaan. Karena komentar yang Anda tinggalkan tidak banyak membantu pengguna untuk mencapai apa yang sebenarnya ia inginkan. Jangan tersinggung, hanya saran. Semoga kamu mengerti.
San

Jika Anda ingin membuat wiki komunitas pertanyaan, beri tanda untuk perhatian moderator. Lihat FAQ wiki komunitas .
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


11

.vimrc

simpan file dengan izin root dengan mengetik w!!:

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


.bashrc

Jangan repot-repot dengan perangkat atau file biner saat grep:

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


Bagikan kode di web (seperti pastebin, tetapi lebih sederhana) oleh cat 1337.sh | webshare

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

Ini memberikan kembali url pendek di clipboard Anda; Anda dapat menambahkan ?whatever-langke URL yang dikembalikan agar sintaksinya disorot dan garis diberi nomor.


.inputrc

Gunakan mode vi dalam segala hal yang menggunakan perpustakaan readline (banyak program):

set editing-mode vi
set keymap vi

Tips luar biasa yang tidak pernah saya ketahui.
San

7

buat direktori dan cd dalam satu perintah

Sebagian besar waktu saya lakukan mkdir, perintah saya selanjutnya adalah cd <that dir>.

Ini menghemat pengetikan:

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

sebagai contoh:

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

Hal lain yang saya temukan berguna adalah cara mudah untuk membuat direktori sekali pakai. mis. jika saya menyusun program atau bahkan jika saya mencoba mereproduksi masalah di situs ini. Terkadang saya lupa membersihkan direktori.

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

menunjukkan itu berfungsi:

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

Saya mengandalkan sistem pembersihan /tmpsetelah reboot, tetapi akan mungkin untuk meningkatkan ini, misalnya membuatnya menghapus direktori temp setelah keluar dari shell.


Saya menyukai opsi mcd. Bagus, terima kasih.
San

+1 Saya telah menggunakan versi saya mcdselama bertahun-tahun dan saya akan menambahkan sesuatu mtdsegera.
maaartinus

Saya mendefinisikan mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }. Mungkin kurang portabilitas, tapi cukup baik untuk saya.
maaartinus

4

Saya ingin agar bash prompt saya menunjukkan kode keluar dari perintah sebelumnya jika bukan nol. Saya juga suka cangkang untuk menghibur saya ketika saya menggunakannya, jadi saya menambahkan sedikit kekonyolan:

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

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

jadi ketika saya menjalankan perintah, saya mendapatkan umpan balik visual yang bagus:

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

edit : ini adalah sesuatu yang saya letakkan di ~ / .bashrc saya


Cukup menarik. Tapi saya ragu. Di mana kode harus berada?
San

Dalam .bashrcmungkin.
Mikel

ya, itu ada di ~ / .bashrc
jsbillings

Akan mencobanya ..
San

4

up N

lompat N direktori di pohon direktori

Alih-alih mengetik

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

Anda cukup mengetik

up 4

dan a

cd -    

akan membawamu kembali

Masukkan fungsi ke dalam .bashrc Anda untuk menggunakannya.

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

Wow .. itu ide yang bagus ..
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

(Swap Tombol Escape dan Caps Lock).


+1 untuk memetakan kembali kunci, Caps Lock saya dipetakan untuk Kembali, SIAPA YANG MEMBUTUHKAN CAPS LOCK ANYWAY?
Mengibaskan

1
Saya pengguna Vim. Ini tipikal bagi pengguna Vim, untuk memetakan Escape to Caps Lock. Pengguna Emacs cenderung memetakan Kontrol ke Caps Lock.
Polemon

1

Saya mengacaukan bashrc saya karena saya sering menggunakan terminal (itu membuat saya belajar dengan cepat dan mempelajari hal-hal menarik untuk digunakan serta alat-alat yang menarik). Saya biasanya mendefinisikan banyak fungsi di bashrc saya. Contoh:

Ekstrak arsip:

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
}

ganti nama file dan folder:

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
}

dan seperti ini untuk membagi file besar menjadi beberapa yang kecil:

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
}

Juga saya mengedit banyak alias karena saya menemukan bahwa jauh lebih mudah untuk menggunakan satu perintah dengan argumen sebagai default dalam beberapa kasus (seperti dalam ls, grep dan perintah kecil) kemudian mengetik semua itu setiap kali.


1

(Komunitas wiki, jadi setiap trik memiliki jawaban yang terpisah.)

logout aman

Ctrl+ Dadalah cara termudah untuk keluar dari shell, tetapi jika Anda masih memiliki pekerjaan, itu akan dengan senang hati keluar dari shell. Secara default, ini berarti semua program yang Anda jalankan dari dalam shell itu akan terbunuh.

Beberapa shell hanya akan membiarkan Anda keluar setelah menekan Ctrl+ Ddua kali, tetapi masih terlalu mudah untuk melakukannya secara tidak sengaja.

Jadi alih-alih, tambahkan ini ke .bashrcatau .zshrcatau file konfigurasi mana pun yang Anda inginkan.

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

(Komunitas wiki, jadi setiap trik memiliki jawaban yang terpisah.)

cari riwayat Anda untuk semua cara Anda menjalankan perintah

Anda mungkin sudah tahu tentang Ctrl+ R, tetapi cara ini jauh lebih mulus IMHO.

Setel Alt+ Puntuk mencari histori perintah yang dimulai dengan apa yang sudah Anda ketikkan.

misal ls Alt+ P, Alt+ P, Alt+ P akan mencari mundur melalui semua lsperintah Anda .

Anda harus memasukkan ini ke dalam /etc/inputrcatau .inputrcuntuk bash:

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

dan ini .zshrcuntuk Anda zsh:

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

Anda bahkan bisa melangkah lebih jauh dan membuat panah Atas melakukan ini.


1

kalkulator sederhana

Anda dapat menggunakan $(( ... ))atau expr ...melakukan perhitungan yang sangat mendasar, tetapi itu memang pembagian integer, misalnya

$ expr 3 / 2
1

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

Cara yang lebih baik adalah menggunakan bc.

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

kemudian:

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

1
Kalkulator saya adalah alias py='PYTHONSTARTUP=~/.pythonstartup python'dengan from math import *;di file itu. Masalah integer-divisi tetap belum terpecahkan, tetapi cara ini lebih bermanfaat untuk operasi yang lebih kompleks.
maaartinus

1

penyelesaian tab yang lebih baik

Saya tidak berpikir ada orang yang menyebutkan menyesuaikan Tabpenyelesaian.

Inilah yang saya miliki.

Dua hal utama yang dilakukannya adalah:

  • setiap perintah akan dikerjakan secara lengkap tergantung pada apa yang diharapkan oleh perintah,
    misalnya cd <Tab>hanya akan menyarankan direktori
  • abaikan case
    eg d<Tab>masih akan selesai DesktopdanDownloads

Untuk 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

Untuk 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

Kompresi aman

Program kompresi menghapus file asli secara default. Saya tidak suka itu.

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

Multi-line prompt

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
  • Memperlihatkan direktori saat ini di baris terpisah. Berguna saat menangani pohon direktori yang dalam pada terminal 80 kolom.
  • Memiliki jam di sudut adalah hal yang hebat jika Anda menggunakan lingkungan grafis. Prompt ini menunjukkan waktu. Sayangnya Anda harus menekan enter untuk memperbaruinya.
  • Anda dapat menampilkan "tag" dengan variabel lingkungan. Contoh:

    tag 'DONT SHTUDOWN!!'
    reset_tags
  • Kode setidaknya sebagian didasarkan pada ini .

Pengaturan riwayat

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
  • Tanpa malu-malu dicuri dari sini .
  • Saya menambahkan dukungan untuk menonaktifkan penebangan secara eksplisit. Berguna jika Anda berurusan dengan program yang mengharapkan kata sandi sebagai argumen CLI.

0
  • bashrc : Saya pengguna zsh, jadi saya memiliki beberapa baris di bashrc saya yang memulai zsh jika tersedia di sistem.
  • zshrc : Alih-alih menyalin zshrc saya dari sesuatu seperti grml (walaupun ada zshrc cukup bagus, jadi jika Anda tidak ingin menggulung sendiri zshrc Anda mungkin salah satu yang terbaik) saya menulis zshrc saya sendiri.
    • Saya memiliki prompt yang disesuaikan. Di antara beberapa hal lain itu menunjukkan kode kembali dari perintah terakhir jika tidak sama dengan 0.
    • Saya punya beberapa alias. Karena saya memiliki akun di beberapa server, saya terkadang harus melakukan pemeriksaan untuk versi perintah yang tersedia pada sistem dan mengatur alias sesuai dengan itu.
    • Saya mengatur variabel PATH saya.
    • Saya menetapkan beberapa variabel lingkungan lain (misalnya $ EDITOR)
  • vimrc : Saya pengguna vim, jadi saya memiliki skema warna yang disesuaikan dan dikustomisasi.
  • screenrc : Saya menggunakan layar GNU untuk menghindari harus membuka banyak terminal dan untuk menjaga sejarah sementara tidak sedang login, jadi saya memiliki screenrc saya sendiri.

0

Jika Anda MENGHIDUPKAN AUTOCOMPLETE DAN FILE CORPORATION SPELLING NAMA! Itu mungkin dua hal yang paling menghemat waktu Anda. Kemudian, pelajari cara menggunakannya - Bash dan Zsh memiliki tab-completion. Ksh memiliki backslash melarikan diri yang tidak efisien, jadi saya akan merekomendasikan melawan Ksh.

Saya menggunakan Zsh, tetapi alias seperti ini akan bekerja di hampir semua shell kecuali 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'

Sepertinya alias untuk 'ps' harus ada di sana, tapi saya menemukan diri saya menggunakan 'ps' dalam berbagai cara, dan saya belum menemukan apa pun sejauh ini.

Di Zsh, atur variabel RPROMPT Anda (bukan salah ketik!):

RPROMPT='%d'

Seluruh direktori muncul di sisi kanan baris perintah, siap untuk memotong-n-paste. Lebih lanjut tentang itu nanti.

Anda harus menggunakan Vim modern yang dikompilasi dengan benar, karena kemampuan untuk memiliki beberapa vim-windows ke dalam file, dan beberapa buffer. .Vimrc Anda dapat memiliki hal-hal seperti ini di dalamnya:

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

Banyak dari itu adalah preferensi pribadi, tetapi saya kebetulan percaya bahwa tab 8-ruang membuat kode kurang dapat dibaca, dan ada penelitian yang membuktikannya.

Juga, "mouse = c" juga penting. Anda seharusnya tidak menggunakan mouse untuk bergerak di dalam file. Mengambil tangan Anda dari keyboard, menyentuh mouse dan menggerakkannya kembali lambat. Gunakan gerakan kursor "hjkl", dan tombol paging dan kursor keyboard lainnya.

Jika Anda menggunakan X11, Anda harus melakukan beberapa hal pada konfigurasi Xterm Anda. Ini keluar dari file .Xresources saya:

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)

Berikan Xterm bilah gulir secara default, simpan 1000 baris teks dalam buffer, itu cukup standar.

Arahan charClass membuat "kata" termasuk hal-hal seperti '.', '/' Dan '*'. Mengklik dua kali pada bagian mana pun dari nama file '/' - yang dipisahkan, dan Anda mendapatkan semuanya, kurang karakter ':'.

cutToBeginningOfLine bekerja dengan Zsh RPROMPT di atas. Klik tiga kali pada jalur direktori kerja saat ini yang muncul pada RHS dari baris perintah Anda, dan Anda hanya mengambil jalur: salin berhenti di awal kata. Sangat efisien setelah Anda terbiasa.

Sumber daya X di atas juga membuat menjadi kunci tempel. Dengan begitu, setelah Anda menyalin (mungkin menggunakan mouse) Anda dapat menempelkannya tanpa menggerakkan tangan Anda kembali ke mouse untuk mengklik.


FWIW, nama file selesai Esc``Escatau Esc``=dalam ksh, dan Tabbekerja di ksh93. Kalau-kalau ada yang terjebak dengan itu atau lebih suka.
Mikel

0

Menambahkan nilai kembali non-nol dari perintah terakhir adalah ide bagus. Saya pikir poster asli secara khusus bertanya tentang .profile / .cshrc / .bashrc. Ada baiknya menyebutkan daftar file RC yang biasanya disesuaikan lainnya, tapi saya akan tetap berpegang pada kustomisasi shell untuk pertanyaan ini.

Saya juga baru-baru menambahkan bendera di prompt saya yang muncul ketika shell berjalan di bawah layar. Ia menggunakan perintah "ptree" solaris untuk mencari proses leluhur, tetapi Anda bisa menggunakan perintah "pstree" di Linux untuk melakukan hal yang sama.

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

Butuh beberapa menit untuk mencari tahu cara menyematkan kode kembali dari perintah terakhir, jadi saya akan mempostingnya di sini.

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

Saya yakin itu bisa dibuat lebih indah. :-)

Tip di masa depan, hati-hati membaca $? setelah menggunakan "jika [". Jika bracket kiri adalah built-in, ia tidak akan menimpa nilai $ ?. Tetapi jika Anda menggunakan shell di mana [tidak built-in, maka itu akan mereset nilai $? setelah pengujian. Lebih aman untuk menetapkan $? ke dalam variabel sementara segera dan kemudian menguji variabel itu.


Jawaban Anda mungkin harus berupa komentar ... Seperti ini!
VxJasonxV

0

tampilkan file yang terakhir diubah

Seringkali, saya ingin melihat file terbaru. misalnya, saya mungkin berada di direktori log, dan ingin melihat file mana yang paling baru karena itu adalah tempat pertama untuk melihat mengapa sesuatu tidak berfungsi.

ls -lt | head adalah jenis tetapi tidak praktis untuk diketik, jadi inilah alternatifnya:

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

Itu juga mengambil wildcard atau daftar file, misalnya

$ latest mail* syslog*
syslog

yang sangat berguna jika semua file log Anda memiliki cap waktu di namanya. Anda dapat menemukan log terbaru untuk program itu, tanpa khawatir format cap waktu apa.

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

Dan inilah versi yang diperluas yang mendukung -<number>opsi untuk mencetak <number>garis alih-alih satu.

# 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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.