Eu tenho um script em uma pasta que uso com argumentos longos. Existe alguma chance de eu ter um histórico dos comandos executados naquele diretório específico, em vez de voltar ao histórico inteiro?
Responder1
Ao conectar-se ao PROMPT_COMMAND do bash, essa função é executada toda vez que você recebe um novo prompt, portanto, é um momento decente para verificar se você está em um diretório para o qual deseja um histórico personalizado. A função tem quatro ramos principais:
- Se o diretório atual (
$PWD
) não tiver sido alterado, não faça nada (retorne).
Se a PCDtemalterado, então configuramos uma função local cujo único propósito é fatorar o código do "diretório personalizado" em um só lugar. Você desejará substituir meus diretórios de teste pelos seus (separados por |
).
- Se não tivermos entrado ou saído de um diretório personalizado, basta atualizar a variável "diretório anterior" e sair da função.
Como mudamos os diretórios, atualize a variável "diretório anterior", salve o histórico da memória em HISTFILE e limpe o histórico da memória.
Se nós mudamosemum diretório personalizado e defina HISTFILE como um
.bash_history
arquivo no diretório atual.Caso contrário, nós mudamosfora deum diretório personalizado, então redefina HISTFILE para o diretório padrão.
Finalmente, como alteramos os arquivos de histórico, leia o histórico anterior.
Para começar, o script define o valor PROMPT_COMMAND e salva duas variáveis de uso interno (o estoque HISTFILE e o "diretório anterior").
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
Responder2
Jeffresponderé ótimo se você quiser o histórico de um único diretório, mas se você concordar com a instalaçãozshvocê poderia usardiretório por históricopara obter um histórico específico do diretório para todos os diretórios.
Você pode instalar o zsh:
brew install zsh
Alternativamente, se você deseja instalaroh-meu-zsh, você pode adicionar nohistóricoplugin e escreva uma consulta personalizada para consultar o banco de dados sqlite que o histdb adiciona. Escrevi sobre isso e como adicionar preenchimentos automáticos em umDiários dos desenvolvedorespublicar. Verifica acomandos de bônusseção.
A consulta fica assim
show_local_history() {
limit="${1:-10}"
local query="
select history.start_time, commands.argv
from history left join commands on history.command_id = commands.rowid
left join places on history.place_id = places.rowid
where places.dir LIKE '$(sql_escape $PWD)%'
order by history.start_time desc
limit $limit
"
results=$(_histdb_query "$query")
echo "$results"
}
Isso também aceita um limite opcional:
show_local_history 50
por exemplo.
Responder3
Quando preciso usar várias vezes um comando com argumentos longos, costumo criar um alias no meu ~/.bash_aliases
ou você pode colocar no seu ~/.bashrc
se preferir. É fácil e economiza tempo, em vez disso procure comandos antigos no histórico.