Eu não acho que isso seja (facilmente) possível.
Eu tentei isso:
alias foo="echo foo;fc -e /home/hl/tmp/testscript.sh 0"
start cmd:> cat /home/hl/tmp/testscript.sh
#! /bin/bash
set -x
# simple case
#test -f "$1" || exit 1
#echo ": alias replacement : echo foo" >"$1"
# complex case
IFS= read -r line <"$1"
: line: _"$line"_
case "$line" in
foo)
echo ": alias replacement : echo foo" >"$1"
;;
bar)
echo ": alias replacement : echo bar" >"$1"
;;
*)
echo ": alias replacement error" >"$1"
;;
esac
A ideia era: executar o comando real e corrigir imediatamente o histórico de comandos, o que pode ser feito pelo bash
builtin fc
. Existem dois problemas:
-
fc
permite editar o arquivo, mas o executa posteriormente. Isso pode ser parcialmente resolvido escrevendo um comando fictício (por exemplo, pré-definir:
). -
O histórico é baseado em linhas que não estão em comandos executados. Assim, o comando a ser modificado ainda não está na pilha. Isso pode ser resolvido por algum truque maléfico como colocar o código em
$PS1
, mas não tenho vontade de tentar ...
história incorporada
Pode haver uma maneira melhor que compartilhe o problema "ainda não na pilha" com a abordagem acima. Eu não estava ciente do builtin history
. Este comando permite escrever e ler o arquivo de histórico. Assim, isso poderia ser feito:
- escreva o arquivo
- modificar o arquivo com, por exemplo
sed
:sed -i 's/^gs$/git status/' ~/.bash_history
- leia o arquivo
O problema do stack histórico pode ser endereçado desta forma (eu não tentei, no entanto):
alias foo="echo foo;(sleep 1; history ...) &"