Почему ll -d */ приводит к дополнительной косой черте?

Вот решение, которое не смешивает истории отдельных сессий!

В основном нужно хранить историю каждого сеанса отдельно и воссоздавать ее при каждом запросе. Да, он использует больше ресурсов, но он не такой медленный, как может показаться -задержка становится заметной, только если у вас более 100000 записей в истории.

Вот основная логика:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

Полное решение, включая некоторые меры безопасности и оптимизацию производительности, см. в этой сути .

1
13.01.2020, 22:07
2 ответа

Список файлов, созданных с помощью */, генерируется оболочкой. Это список каталогов с уже добавленным /:

.
$ echo */
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ snap/ Templates/ Videos/

Генерируется в одной утилите (оболочке )и передается другой утилите(ls)для дальнейшего разрешения и обработки.

Это список, который получает ls. Вот почему вам нужна опция -d, чтобы повторять список, не заходя внутрь каждого каталога.

Если вы добавите параметр ' -p' к ls,он добавит дополнительный /к каждому каталогу, чтобы указать, что это каталог:

$ ls -pd */
Desktop//  Documents//  Downloads//  Music//  Pictures//  Public//  snap//  Templates//  Videos//

Если параметр цвета для ls активен, вы должны увидеть путь одним цветом, а /— другим.

Опция -Fls аналогична опции -p, но может также использовать другие символы для обозначения других типов файлов (не только каталогов )с каждым символом из этого списка:один из*/=>@|

2
28.04.2021, 23:25

Есть способ перечислить каталоги только с ll -d */ без дополнительного /.

Если вы поместите следующую функцию в.bashrc, она вступит в силу после того, как вы выполните «unalias ll» или удалите «alias ll» из.bashrc

function ll {
    local option=F OPTIND c
    while getopts d c; do
        case $c in
            d) option=$c;;
        esac
    done; shift "$((OPTIND - 1))"
    ls -la -$option "$@"
}
0
28.04.2021, 23:25

Теги

Похожие вопросы