Вот решение, которое не смешивает истории отдельных сессий!
В основном нужно хранить историю каждого сеанса отдельно и воссоздавать ее при каждом запросе. Да, он использует больше ресурсов, но он не такой медленный, как может показаться -задержка становится заметной, только если у вас более 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
Полное решение, включая некоторые меры безопасности и оптимизацию производительности, см. в этой сути .
Список файлов, созданных с помощью */
, генерируется оболочкой. Это список каталогов с уже добавленным /
:
$ 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 активен, вы должны увидеть путь одним цветом, а /
— другим.
Опция -F
ls аналогична опции -p
, но может также использовать другие символы для обозначения других типов файлов (не только каталогов )с каждым символом из этого списка:один из*/=>@|
Есть способ перечислить каталоги только с 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 "$@"
}