Vous vous souvenez de l'historique bash «local» dans un dossier?

11

J'ai un script dans un dossier que j'utilise avec de longs arguments. Y a-t-il une chance que je puisse avoir un historique des commandes exécutées dans ce répertoire spécifique au lieu de parcourir l'historique en entier?

faber
la source
3
Question interessante. BTW, au lieu de revenir "à travers toute l'histoire", vous pouvez utiliser Ctrl + R pour le rechercher, c'est ce que je ferais dans de telles situations.
phk
oui, ça aide mais de cette façon je n'ai que le dernier. Y a-t-il une possibilité d'avoir plus d'un résultat?
faber
1
Vous pouvez continuer à appuyer sur Ctrl + R une fois que vous avez entré une partie du nom de la commande.
mtahmed
history | lesspeut-être? Cela ne répond pas vraiment à votre question, mais c'est par là que je commencerais.
roaima
@roaima Et ensuite en utilisant "/" + terme-de-recherche + enter et ensuite "n" / "N" pour une recherche plus avant / arrière.
phk

Réponses:

2

En vous connectant à PROMPT_COMMAND de bash, cette fonction est exécutée chaque fois que vous obtenez une nouvelle invite, c'est donc un moment décent pour vérifier si vous êtes dans un répertoire pour lequel vous souhaitez un historique personnalisé. La fonction a quatre branches principales:

  1. Si le répertoire courant ( $PWD) n'a pas changé, ne faites rien (retour).

Si le PWD a changé, nous mettons en place une fonction locale dont le seul but est de factoriser le code "répertoire personnalisé" en un seul endroit. Vous voudrez remplacer mes répertoires de test par les vôtres (séparés par |).

  1. Si nous n'avons pas changé dans ou hors d'un répertoire personnalisé, mettez simplement à jour la variable "répertoire précédent" et sortez de la fonction.

Puisque nous avons changé de répertoire, mettez à jour la variable "répertoire précédent", puis enregistrez l'historique en mémoire dans le HISTFILE, puis effacez l'historique en mémoire.

  1. Si nous avons changé en un répertoire personnalisé, définissez HISTFILE pour être un .bash_historyfichier dans le répertoire actuel.

  2. Sinon, nous avons changé de répertoire personnalisé, alors réinitialisez HISTFILE dans le répertoire d'origine.

Enfin, puisque nous avons modifié les fichiers d'historique, relisez cet historique précédent.

Pour faire avancer les choses, le script définit la valeur PROMPT_COMMAND et enregistre deux variables à usage interne (le stock HISTFILE et le "répertoire précédent").

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
Jeff Schaller
la source
0

La réponse de Jeff est excellente si vous voulez l'historique d'un seul répertoire, mais si vous êtes d'accord avec l'installation de zsh, vous pouvez utiliser per-history-directory pour obtenir un historique spécifique au répertoire pour tous les répertoires.

Vous pouvez installer zsh en:

brew install zsh

Sinon, si vous voulez installer oh-my-zsh , vous pouvez ajouter dans le histdb plug - in et d' écrire une requête personnalisée pour interroger la sqlite db que histdb ajoute. J'écrit à ce sujet et en ajoutant complétions auto dans un Diaries Dev poste. Vérifiez la section des commandes bonus .

La requête ressemble à ceci

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"
}

Cela accepte également une limite facultative:

show_local_history 50

par exemple.

Khaliq Gant
la source
-1

Lorsque j'ai besoin d'utiliser plusieurs fois une commande avec de longs arguments, je crée généralement un alias dans my ~/.bash_aliasesou vous pouvez le mettre dans votre ~/.bashrcsi vous préférez. C'est facile et gagnez du temps, recherchez plutôt les anciennes commandes de l'historique.

andreatsh
la source
1
C'est un bon indice mais pas ce que OP recherchait. OP était assez spécifique pour ce qu'il / elle recherchait (une solution que je souscrirais également à BTW).
phk
@phk Tu as raison, je serai plus prudent la prochaine fois! Merci pour votre explication!
andreatsh