[mikeserv@localhost ~]$ PS1=$PS1'$(
[ ${last_hist=\!} -ne \! ] && {
h=$(history 1)
[ -n "${h#"${h##* cd *}"}" ] &&
. ./.dircmd >&2 2>/dev/null
})${0##*["$0"$((last_hist=\!))]*}'
[mikeserv@localhost ~]$ cd .
[mikeserv@localhost ~]$
[mikeserv@localhost ~]$ echo
[mikeserv@localhost ~]$ cat <<\DIRCMD >.dircmd
echo this is my home directory
> DIRCMD
[mikeserv@localhost ~]$
[mikeserv@localhost ~]$ echo
[mikeserv@localhost ~]$ cd .
this is my home directory
[mikeserv@localhost ~]$
Algo assim deve funcionar para um sistema POSIX - embora eu ache que apenas bash
requeira a barra invertida antes do "! bang" assim. bash
também parece atualizar o histórico de uma forma que não funciona com fc
- que é portátil - mas funciona com history
. Em outros shells, o history 1
bit deve ser permutável com fc -l -1
, mas bash
faz um comando por trás, eu acho. Foi muito frustrante.
De qualquer forma, toda vez que o prompt é desenhado, ele define a variável $last_hist
como o número do histórico do último comando. Ele faz isso no campo de correspondência em uma substituição de parâmetro que sempre será igual a nada, de modo que não apareça no prompt.
O fc
check apenas garante que o último número do histórico realmente foi incrementado - como em, você não apenas pressionou enter ou o que quer que seja. Ele também verifica se o último comando foi um cd
. Se ambos forem verdadeiros, ele tentará .
fornecer um arquivo no diretório atual denominado .dircmd
. Se existir, corre. Se não, tudo bem.