Какие настройки вы сделали в своем профиле оболочки для повышения производительности?

25

Я знаю, что некоторые люди имеют некоторые сценарии запуска, а некоторые персонализируют приглашение. Один разработчик использует короткие псевдонимы для длинного пути, который он часто посещает, и часто используемых команд.

Каковы все эффективные настройки, которые вы выполнили в своем профиле UNIX для повышения производительности и простоты использования?

Сан
источник
должен быть CW, не могу ответить объективно.
Акира
Я согласен. Тем не менее, не было никакого варианта для CW. :-(
Сан
@akira @Michael Я часто сталкиваюсь с этой ситуацией. Было бы здорово, если бы модераторы могли редактировать / переписывать / перенаправлять вопрос. Потому что комментарий, который вы оставляете, не очень помогает пользователю добиться того, чего он действительно хочет. Без обид, просто предложение. Надеюсь ты понимаешь.
Сан
Если вы хотите задать вопрос сообществу вики, пометьте его модератором. Смотрите вики-сообщество FAQ .
Жиль "ТАК - перестань быть злым"

Ответы:

11

.vimrc

сохраните файл с правами root, набрав w!!:

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


.bashrc

Не связывайтесь с устройствами или бинарными файлами при grepзагрузке:

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


Поделиться кодом в Интернете (например, pastebin, но проще) cat 1337.sh | webshare

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

Это возвращает короткий URL в вашем буфере обмена; Вы можете добавить ?whatever-langк возвращенному URL, чтобы выделить его синтаксис и пронумеровать строки.


.inputrc

Используйте режим vi во всем, что использует библиотеку readline (многие программы):

set editing-mode vi
set keymap vi
Шон Дж. Гофф
источник
Отличные советы, которых я никогда не знал.
San
7

сделать каталог и компакт-диск в одной команде

Большую часть времени я делаю 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$ 

Еще одна вещь, которую я считаю полезной, - это простой способ создать одноразовый каталог. например, если я собираю программу или даже пытаюсь воспроизвести проблему на этом сайте. Иногда я могу забыть очистить каталог.

# 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после перезагрузки, но это можно было бы улучшить, например, заставить ее удалить временный каталог после выхода из оболочки.

Mikel
источник
Мне понравился вариант McD. Хороший, спасибо.
San
+1 Я использую свою версию mcdуже много лет и собираюсь добавить что-то подобное в mtdближайшее время.
Maaartinus
Я определил мой mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }. Возможно, ему не хватает портативности, но для меня этого достаточно.
Maaartinus
4

Мне нравится, когда моя подсказка 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

оборота
источник
Довольно интересно. Но у меня есть сомнения. Где должен находиться код?
San
По- .bashrcвидимому.
Микель
да, это в моем ~ / .bashrc
jsbillings
Попробую это ..
Сан
4

до 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
}
неизвестный пользователь
источник
Вау .. это хорошая идея ..
Сан
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

Переключение клавиш Escape и Caps Lock.

Полемон
источник
+1 для переназначения ключей, мой Caps Lock сопоставлен с Return, КТО НУЖДАЕТСЯ В КАЧЕСТВЕ БЛОКИРОВКИ CAP?
вилять
1
Я пользователь Vim. Для пользователей Vim характерно сопоставление Escape и Caps Lock. Пользователь Emacs склонен сопоставлять Control с Caps Lock.
Полемон
1

Я запутался в своем 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
}

Также я отредактировал много псевдонимов, поскольку обнаружил, что в некоторых случаях гораздо проще использовать одну команду с аргументами по умолчанию (например, в командах ls, grep и small), чем каждый раз вводить все это.

user2648
источник
1

(Сообщество вики, поэтому каждый трюк принадлежит в отдельном ответе.)

безопасный выход

Ctrl+ D- это самый простой способ выйти из оболочки, но если у вас все еще есть рабочие места, он все равно с радостью выйдет из оболочки. По умолчанию это означает, что все программы, которые вы запускали из этой оболочки, будут уничтожены.

Некоторые оболочки позволяют вам выйти из системы только после двойного нажатия Ctrl+ D, но это все равно слишком легко сделать случайно.

Таким образом , вместо того, чтобы добавить это .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
}
Mikel
источник
1

(Сообщество вики, поэтому каждый трюк принадлежит в отдельном ответе.)

искать в своей истории все способы запуска команды

Возможно, вы уже знаете о Ctrl+ R, но это гораздо более гладко, ИМХО.

Установите Alt+ Pдля поиска в истории команд, которые начинаются с того, что вы уже ввели.

Например, ls Alt+ P, Alt+ P, Alt+ P будет искать в обратном направлении по всем вашим lsкомандам.

Вы должны поместить это в свой /etc/inputrcили .inputrcдля bash:

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

и это в вашем .zshrcдля zsh:

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

Вы могли бы даже сделать еще один шаг и сделать это стрелкой вверх.

Mikel
источник
1

простой калькулятор

Вы можете использовать $(( ... ))или 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
Mikel
источник
1
Мой калькулятор alias py='PYTHONSTARTUP=~/.pythonstartup python'с from math import *;в этом файле. Проблема целочисленного деления остается нерешенной, но она более удобна для более сложных операций.
Maaartinus
1

лучшее завершение вкладки

Я не думаю, что кто-то упомянул Tabзавершение настройки еще.

Вот что у меня есть.

Это две основные вещи:

  • каждая команда завершится на вкладке в зависимости от того, что ожидает команда,
    например, cd <Tab>будет предлагать только каталоги
  • игнорировать регистр,
    например d<Tab>все равно будет завершен DesktopиDownloads

Для Баш:

# 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

Для зш:

# 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

Безопасное сжатие

Программы сжатия удаляют исходный файл по умолчанию. Мне это не нравится

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
  • Код по крайней мере частично основан на этом .

Настройки истории

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.
стрибика
источник
0
  • bashrc : я пользователь zsh, поэтому в моем bashrc есть несколько строк, которые запускают zsh, если он доступен в системе.
  • zshrc : вместо того, чтобы копировать мой zshrc из чего-то вроде grml (хотя там zshrc довольно хорош, поэтому, если вы не хотите, чтобы их собственные свернули, вероятно, один из лучших), я пишу свой собственный zshrc.
    • У меня есть индивидуальная подсказка. Среди прочего он показывает код возврата последней команды, если он не равен 0.
    • У меня есть псевдонимы. Поскольку у меня есть учетные записи на большом количестве серверов, мне иногда приходится проверять, какая версия команды доступна в системе, и соответственно устанавливать псевдоним.
    • Я установил переменную PATH.
    • Я установил некоторые другие переменные окружения (например, $ EDITOR)
  • vimrc : Я пользователь vim, поэтому у меня есть индивидуальная и индивидуальная цветовая схема.
  • screenrc : я использую экран GNU, чтобы избежать необходимости открывать несколько терминалов и сохранять историю, не входя в систему, поэтому у меня есть свой собственный screenrc.
Кристоф Вурм
источник
0

Если вы можете ВКЛЮЧИТЬ АВТОКОМПЛЕКТ И ИСПРАВЛЕНИЕ ИМЕНИ ФАЙЛА ИМЕНИ ФАЙЛА! Это, вероятно, две вещи, которые сэкономят вам больше всего времени. Затем научитесь их использовать - у 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'

Весь каталог появляется в правой части командной строки, готовый для вырезания-вставки. Подробнее об этом позже.

Вы должны использовать правильно скомпилированный современный Vim из-за возможности иметь несколько окон 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 пробелами делают код менее читабельным, и есть исследование, которое можно найти, чтобы доказать это.

Кроме того, "мышь = с" важно. Вы не должны использовать мышь для перемещения по файлу. Отнимите руки от клавиатуры, прикоснитесь к мышке и отодвиньте их назад медленно. Используйте «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 «слово» включает такие слова, как «.», «/» И «*». Двойной щелчок на любой части имени файла, разделенного символом «/», и вы получите все, кроме символов «:».

CutToBeginningOfLine работает с Zsh RPROMPT выше. Тройной щелчок по пути текущего рабочего каталога, который появляется в RHS вашей командной строки, и вы выбираете только путь: копия останавливается в начале слова. Высокоэффективно, как только вы к этому привыкли.

Вышеуказанные X-ресурсы также превращают их в ключ вставки. Таким образом, после того, как вы скопировали (возможно, с помощью мыши), вы можете вставить, не перемещая руку назад к мыши, чтобы щелкнуть.

Брюс Эдигер
источник
FWIW, завершение имени файла - Esc``Escили Esc``=в ksh, и Tabработает в ksh93. На всякий случай, если кто-то застрял или предпочитает это.
Микель
0

Добавление ненулевого возвращаемого значения последней команды - отличная идея. Я думаю, что оригинальный постер специально спрашивал о .profile / .cshrc / .bashrc. Стоит упомянуть список других обычно настраиваемых RC-файлов, но я бы остановился только на настройках оболочки для этого вопроса.

Я также недавно добавил флаг в моем приглашении, который отображается, когда оболочка работает под экраном. Он использует команду Solaris "ptree" для поиска процессов-предков, но вы можете использовать команду "pstree" в Linux, чтобы сделать то же самое.

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 [". Если левая скобка является встроенной, она не переопределит значение $ ?. Но если вы используете оболочку, где [не является встроенной, то она сбросит значение $? после тестирования. Безопаснее назначить $? во временную переменную сразу, а затем проверить эту переменную.

оборота Крис Кнель
источник
Ваш ответ, вероятно, должен быть комментарием ... Вот так!
VxJasonxV
0

показать последний измененный файл

Часто я хочу посмотреть на самый последний файл. например, я могу быть в каталоге logs и хочу посмотреть, какой файл самый последний, потому что это первое место, где можно посмотреть, почему что-то не работает.

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

А вот расширенная версия, которая поддерживает -<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
}
Микель
источник