Благодаря подключению к PROMPT_COMMAND bash, эта функция запускается каждый раз, когда вы получаете новый запрос, так что это подходящее время для проверки, находитесь ли вы в каталоге, для которого вам нужна пользовательская история. Функция имеет четыре основных ветви:
$PWD
) не изменился, то ничего не делать (возврат). Если PWD изменился, то мы создаем локальную функцию, единственная цель которой - собрать код "пользовательского каталога" в одном месте. Вы захотите заменить мои тестовые директории на свои собственные (разделенные |
).
Если мы изменили директорию, обновите переменную "previous directory", затем сохраните историю в памяти в HISTFILE, затем очистите историю в памяти.
Если мы сменили на пользовательский каталог, то установите HISTFILE как .bash_history
файл в текущем каталоге.
В противном случае, мы изменили из пользовательского каталога, поэтому сбросьте HISTFILE на стоковый.
Наконец, поскольку мы изменили файлы истории, прочитайте предыдущую историю.
Чтобы начать работу, скрипт устанавливает значение PROMPT_COMMAND и сохраняет две переменные внутреннего использования (стоковый HISTFILE и "предыдущий каталог").
prompt_command() {
# if PWD has not changed, just return
[[ $PWD == $_cust_hist_opwd ]] && return
function iscustom {
# returns 'true' if the passed argument is a custom-history directory
case "$1" in
( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
( * ) return 1;;
esac
}
# PWD changed, but it's not to or from a custom-history directory,
# so update opwd and return
if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
then
_cust_hist_opwd=$PWD
return
fi
# we've changed directories to and/or from a custom-history directory
# save the new PWD
_cust_hist_opwd=$PWD
# save and then clear the old history
history -a
history -c
# if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
if iscustom "$PWD"
then
HISTFILE=$PWD/.bash_history
else
HISTFILE=$_cust_hist_stock_histfile
fi
# pull back in the previous history
history -r
}
PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD
Я нашел причину проблемы. Медленное соединение было из-за конфигурации IPv6. Когда я отключил IPv6, все заработало нормально.
$ sudo nano /etc/sysctl.conf
Добавлены следующие конфигурации в конец файла:
# IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Затем перезапущен sysctl.conf
:
$ sudo sysctl -p