5 votes

Pourquoi est-ce que `history -a` ne fonctionne pas ?

Je travaille sous OS X 10.9.1 (Mavericks), en utilisant Terminal, qui rapporte qu'il s'agit de GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)

J'ai remarqué des problèmes étranges où l'historique ne fonctionnait pas correctement : history -a y history -a filename.txt ne pas faire tout ce qui est . history montre l'histoire à laquelle je m'attendais. Cela brise la synchronisation de l'historique de mon .bashrc entre les terminaux.

J'ai commencé à enquêter en modifiant manuellement les variables HIST de bash. Voici comment je parviens à reproduire mon problème dans des conditions quelque peu contrôlées :

  1. J'ai désactivé mon .bashrc

  2. J'ai ouvert une nouvelle fenêtre de terminal et effacé l'historique.

    history -c
  3. J'ai confirmé que ma PROMPT_COMMAND est revenue à la normale/par défaut :

    echo $PROMPT_COMMAND

    Cela renvoie : update_terminal_cwd ;

  4. J'ai défini manuellement les variables HIST pertinentes :

    export HISTFILE="/Users/rsage/temp_history.txt"
    export HISTSIZE=20000
    export HISTFILESIZE=20000
  5. Je confirme que mes fichiers d'historique de test sont supprimés :

    ls *history*.txt # To make sure I know what I'm about to delete
    rm *history*.txt
  6. Je tente de sauvegarder l'historique en utilisant history -a sans succès

    history -a
    history -a history_a.txt
    ls -ltr ; date

    Ce dernier ne présente aucun fichier historique :

    ...
    drwx------+ 40 rsage  staff   1360 Dec 20 14:16 Desktop
    drwxr-xr-x   4 rsage  staff    136 Dec 20 18:48 webApps
    drwxr-xr-x   8 rsage  staff    272 Dec 22 09:11 code
    drwxr-xr-x  17 rsage  staff    578 Dec 22 09:26 stuff

    Sun Dec 22 10:17:50 PST 2013

  7. ...mais je suis tombée sur la history -w (je sais que cela écrase le fichier, ce qui est bien avec mon bashrc nominal) et cela semble fonctionner correctement :

    history -w
    history -w history_w.txt
    ls -ltr ; date

    ce qui donne les résultats escomptés :

    ...
    drwx------+ 40 rsage  staff   1360 Dec 20 14:16 Desktop
    drwxr-xr-x   4 rsage  staff    136 Dec 20 18:48 webApps
    drwxr-xr-x   8 rsage  staff    272 Dec 22 09:11 code
    drwxr-xr-x  17 rsage  staff    578 Dec 22 09:26 stuff
    -rw-------   1 rsage  staff    461 Dec 22 10:19 temp_history.txt
    -rw-------   1 rsage  staff    494 Dec 22 10:19 history_w.txt

Une dernière note. Il m'est venu à l'esprit que mes tailles étaient peut-être trop grandes, alors j'ai juste essayé 200 et aucun changement de comportement (les trente sont les chiffres de sortie de l'histoire) :

34  export HISTFILESIZE=200
35  export HISTSIZE=200
36  history -a
37  history -a history_a.txt
38  ls -ltr ; date

Les sorties ls ne montrent aucun nouveau fichier.

0 votes

Je viens de répéter l'expérience sur un autre ordinateur avec OS X 10.8.5, GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12). Je suppose que ce n'est pas Mavericks...

1voto

RalphK Points 11

J'ai remarqué le même comportement étrange, j'ai vérifié les permissions, et bien sûr, le "Monde" et le "Système" avaient des permissions explicites pour lire ET écrire mon fichier .bash_history, mais moi (le propriétaire) je n'avais aucune permission pour ce fichier !

J'ai juste forcé "World" à "No Access" et me suis donné à moi-même et au système un accès r/w et voilà, tout fonctionne comme il le devrait.

1voto

Wildcard Points 874

Pour El Capitan (10.11.6), j'ai rencontré les problèmes suivants history -a ne fonctionne pas - https://unix.stackexchange.com/q/473581/135943

Je copie ma propre réponse de là :


Il semble que ce soit quelque chose de spécifique à Apple. (J'utilise Mac OS 10.11.6 El Capitan).

Mon HISTFILE La valeur est la cause immédiate :

[512] $ echo $HISTFILE
/Users/Wildcard/.bash_sessions/8BC6B122-0D74-445B-B6A0-7D4D446598CB.historynew

Mais puisque je ne fixe pas cette variable, où est-elle fixée ?

Aha, c'est dans /etc/bashrc_Apple_Terminal . Et d'après les commentaires, il semble que je n'ai rencontré ce problème que parce que j'ai essayé history -a par lui-même, sans jamais mettre shopt -s histappend . Ils l'ont codé de sorte que si vous activez histappend, ou définissez la variable HISTTIMEFORMAT, ils sautent le code de support de reprise de session.

Voici la documentation en ligne pour cette section :

# Resume Support: Save/Restore Shell State
#
# Terminal assigns each terminal session a unique identifier and
# communicates it via the TERM_SESSION_ID environment variable so that
# programs running in a terminal can save/restore application-specific
# state when quitting and restarting Terminal with Resume enabled.
#
# The following code defines a shell save/restore mechanism. Users can
# add custom state by defining a shell_session_save_user_state function
# that writes restoration commands to the session file at exit. e.g.,
# to save a variable:
#
#   shell_session_save_user_state() { echo MY_VAR="'$MY_VAR'" >> "$SHELL_SESSION_FILE"; }
#
# During shell startup the session file is executed. Old files are
# periodically deleted.
#
# The default behavior arranges to save and restore the bash command
# history independently for each restored terminal session. It also
# merges commands into the global history for new sessions. Because
# of this it is recommended that you set HISTSIZE and HISTFILESIZE to
# larger values.
#
# You may disable this behavior and share a single history by setting
# SHELL_SESSION_HISTORY to 0. There are some common user customizations
# that arrange to share new commands among running shells by
# manipulating the history at each prompt, and they typically include
# 'shopt -s histappend'; therefore, if the histappend shell option is
# enabled, per-session history is disabled by default. You may
# explicitly enable it by setting SHELL_SESSION_HISTORY to 1.
#
# The implementation of per-session command histories in combination
# with a shared global command history is incompatible with the
# HISTTIMEFORMAT variable--the timestamps are applied inconsistently
# to different parts of the history; therefore, if HISTTIMEFORMAT is
# defined, per-session history is disabled by default.
#
# Note that this uses PROMPT_COMMAND to enable per-session history
# the first time for each new session. If you customize PROMPT_COMMAND
# be sure to include the previous value. e.g.,
#
#   PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }your_code_here"
#
# Otherwise, the per-session history won't take effect until the first
# restore.
#
# The save/restore mechanism is disabled if the following file exists:
#
#   ~/.bash_sessions_disable

1 votes

+1 Ceci semble être la solution la plus pertinente, il suffit de définir SHELL_SESSION_HISTORY comme vous le souhaitez

0voto

sage Points 181

J'ai deux réponses : pourquoi la procédure ne fonctionne pas et pourquoi mon problème initial s'est produit.

histoire -a question

En plus de la procédure de répétition ci-dessus, j'ai commencé à construire systématiquement mon .bashrc à partir de la base. Assez rapidement, j'ai déterminé que c'est le fichier history -c qui détruit tout.

Si vous effectuez la procédure avec ou sans le history -c vous trouvez que history -a fonctionne si history -c n'a pas été appelé dans l'instance de bash et de history -a échoue si history -c a été appelé.

solution au problème initial

Cette réponse n'était pas très satisfaisante, d'autant plus que ma formule .bashrc repose sur les éléments suivants history -c dans le cadre de la propagation de l'histoire (la norme export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" montré à Préserver l'historique de bash dans plusieurs terminaux Windows entre autres).

Sans résoudre le problème ci-dessus, il semble que le problème de propagation de l'historique résulte de l'utilisation d'un chemin (relatif) dans HISTFILE. HISTFILE semble vouloir un nom de fichier sans chemin. Ainsi, en passant de HISTFILE="~/.bash_history_shared" a HISTFILE=".bash_history_shared" corrige le problème original.

Cela soulève la question évidente de savoir si cela résout le premier problème présenté ci-dessus. Il semble que non. Ceci étant dit, le fait que le export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" semble suggérer que peut-être le comportement bizarre pour moi de history -a n'est pas inhabituel... ?

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X