Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/05/2018, à 21:08

iro

[Impossibe/Contourné] Commande 'history' dans .zshrc

Bonjour,

je voudrais supprimer les commandes tapées qui retournent une erreur différante de 0, en gros les erreurs de frappes. Voici mon code qui retourne toujours le retour 0 même en tapant "toto":

VAR1='history|tail -n2|cut -c 4-7' # affiche le numéro de la commande
VAR2=`tail -n 1 ${HISTFILE}|cut -c 16-100|echo $?` # affiche le code retour de la dernière commande

if [[ "$VAR2" != "0" ]]
	then
history -d $VAR1

	fi

Même si mon code fonctionnait, il ne me supprimerait que la dernière commande erronée. L'idéal serait que le script me supprime toute les commandes retournant une erreur dans l'historique.

Est-ce possible ?
Merci pour votre retour smile

Dernière modification par iro (Le 21/05/2018, à 20:55)


Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne

#2 Le 18/05/2018, à 21:18

Watael

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

salut,

attention, VAR1 contient littéralement history|tail..., et pas le développement du pipe.

echo ne prend pas de données sur son entrée standard, donc lui envoyer des données par un pipe est sans effet.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 18/05/2018, à 21:33

iro

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

Salut Watael,

j'ai pas tout compris... Les commandes fonctionnent en les tapant dans un terminal. Comment ferais-tu avec un script ?


Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne

#4 Le 18/05/2018, à 23:00

iro

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

J'ai essayé ça, mais apparement la commande history n'est pas reconnue par le script:

VAR1='history|tail -n2|cut -c 4-7'
VAR2='history|tail -n1|cut -c 16-100|echo $?'

if [[ "`$VAR2`" != "0" ]]
	then
history -d `$VAR1`
	fi

Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne

#5 Le 18/05/2018, à 23:28

Watael

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

donne-nous un échantillon représentatif de la sortie de la commande history, s'il te plaît, qu'on valide les commandes, parce que tail -n 2 affiche les deux dernières lignes, pas l'avant dernière ligne !

une variable sert à stocker le résultat d'une commande.

ensuite, je ne sais comment le dire autrement, c'est tellement évident !

$ false
$ echo bla | cat - | echo $?
1

echo ne reçoit rien sur son entrée standard, et surtout pas le code de retour d'une commande ou d'un pipe.
ici, le code de retour est celui de la commande précédente, pas celui du pipe.

EDIT :

en te relisant, « supprimer les commandes tapées qui retournent une erreur différante de 0, en gros les erreurs de frappes », je me dis que tu n'exprimes pas correctement tes intentions (d'où la nécessité de fournir un extrait des données, ET du résultat attendu), et que par conséquent, ton algorithme/code est, lui, faux wink :
une commande dont le code de retour est différent de zéro n'est pas forcément une faute de frappe.
false retourne 1, pourtant cette commande est valide !
pareil pour un test, qui peut retourner faux alors que sa syntaxe est correcte.

EDIT2 : tu devrais peut-être faire quelques recherches pour activer les capacités de correcteur syntaxique que propose zsh !

Dernière modification par Watael (Le 19/05/2018, à 04:55)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 19/05/2018, à 14:08

iro

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

Je suis tombé sur ça qui dit en gros:

Malheureusement, les outils d'historique de Bash n'ont pas d'utilité dans un script.

#!/bin/bash
# history.sh
# Essai d'utilisation de la commande 'history' dans un script.

history

# Le script n'affiche rien.
# Les commandes d'historique ne fonctionnent pas à l'intérieur d'un script.

bash$ ./history.sh
(pas de sortie)

donc apparemment je ne peux pas me servir de la commande history dans un script. Ca tombe à l'eau smile

Une commande dont le code de retour est différent de zéro n'est pas forcément une faute de frappe: je ne savais pas.

Je te donne mon zshrc:

# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '~/.zshrc'

# Complétion
autoload -Uz compinit
compinit
# End of lines added by compinstall

## Auto-correction
setopt correctall

## Thème
autoload -Uz promptinit
prompt oliver
neofetch

## Supprimer historique inutile
export HISTCONTROL=erasedups
export HISTCONTROL=ignorespace

## Autosuggestion
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

## Couleur syntaxique
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

export VISUAL='/usr/bin/nano'
export EDITOR="$VISUAL"

J'ai trouvé un moyen pour contourné mon problème en ajoutant un espace avant ma commande grace à HISTCONTROL=ignorespace.
J'ai essayé d'ajouter export HISTIGNORE='COM1:COM2:COM3' mais les commandes ne sont pas ignorées dans l'historique.

Dernier truc la command history -d N (N étant le numéro de la commande à effacer) ne marche pas après fermeture et réouverture du terminal. Une idée ?


Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne

#7 Le 19/05/2018, à 15:36

Watael

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

en effet, dans les scripts bash, l'historique est désactivé par défaut, mais bash n'est pas zsh (ce sont deux shell différents, compatibles POSIX, mais différents), et je ne connais pas en détail zsh.
je ne suis pas sûr que HISTCONTROL existe en zsh...

history -d N est instantané, il agit sur l'historique courant, il n'est pas nécessaire de démarrer une nouvelle session pour que les changements soient effectifs.

merci pour le .zshrc, mais c'est la sortie de la commande history dont j'ai besoin.

et il faut nous en dire davantage sur tes intentions globales, et plus en détail.

Dernière modification par Watael (Le 19/05/2018, à 15:41)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 19/05/2018, à 16:57

iro

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

je ne suis pas sûr que HISTCONTROL existe en zsh...

Si, ça marche avec zsh. La commande tapé avec un espace est bien supprimée du fichier histfile. Par contre, HISTIGNORE n'a pas l'air de fonctionner avec zsh.

history -3
    9  history
   10  toto
   11  commande_a_supprimer

Par exemple ce que j'aurais voulu avec le script, c'est supprimer les commandes 10 et 11. En gros toutes les commandes qui sont erronées, que se soit la syntaxe ou les erreurs de frappes...

history -d 10 ne marche pas chez moi. La commande "toto" reste dans histfile.

history -d 10
   10  16:39  toto
   11  16:39  commande_a_supprimer

history -3              
    9  history
   10  toto
   11  commande_a_supprimer

Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne

#9 Le 19/05/2018, à 17:45

Watael

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

je découvre avec toi.
history est une sorte d'alias pour fc -l.
or, fc ne semble pas disposer d'option de suppression, et l'option -d, elle, ne fait qu'afficher l'heure à laquelle la commande a été exécutée.

pourquoi parser la sortie de history, et pas le fichier d'historique ?
et autant vérifier les fautes de frappes est facile (la commande existe ou pas), autant vérifier la syntaxe va être plus complexe.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 20/05/2018, à 13:38

iro

Re : [Impossibe/Contourné] Commande 'history' dans .zshrc

Je ne connaissais pas la commande fc, donc mon script n'est pas réalisable..
je me contenterais de l'espace avant la commande.
Merci pour ta contribution smile


Aime la vie et vis la vie que tu aimes.
Boinc pour aider la science.

Hors ligne