Comment puis-je enregistrer la dernière commande dans un fichier?

29

Lorsque j'exécute mes analyses à l'aide du shell bash, je veux souvent enregistrer les commandes que j'ai utilisées qui m'ont donné de bons résultats dans un fichier du même répertoire (mon "LOGBOOK", comme on l'appelle) pour pouvoir vérifier ce que Je l'ai fait pour obtenir ces résultats. Jusqu'à présent, cela m'a signifié de copier la commande à partir du terminal ou d'appuyer sur "up" pour modifier la commande en une echo"my command" >> LOGBOOKou d'autres pitreries similaires.

J'ai trouvé qu'il y avait un historyoutil l'autre jour, mais je ne peux pas trouver un moyen de l'utiliser pour obtenir la commande précédemment exécutée afin que je puisse faire quelque chose comme getlast >> LOGBOOK.

Existe-t-il un moyen facile et facile de le faire. Sinon, comment les autres gèrent-ils l'enregistrement des commandes pour les résultats qu'ils ont?

MattLBeck
la source

Réponses:

37

Si vous utilisez bash, vous pouvez utiliser la fccommande pour afficher votre historique comme vous le souhaitez:

fc -ln -1

Cela imprimera votre dernière commande. -lsignifie liste, -nsignifie ne pas préfixer les lignes avec les numéros de commande et -1dit d'afficher uniquement la dernière commande. Si l'espace blanc au début de la ligne (uniquement la première ligne sur les commandes multilignes) est gênant, vous pouvez vous en débarrasser assez facilement avec sed. Faites-en une fonction shell, et vous avez une solution comme demandé ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

Cela devrait fonctionner comme vous l'avez demandé dans votre question.

J'ai ajouté une légère variation en ajoutant "$1" "$1"à la fccommande. Cela vous permettra de dire, par exemple, getlast mycommandd'imprimer la dernière ligne de commande en invoquant mycommand, donc si vous avez oublié d'enregistrer avant d'exécuter une autre commande, vous pouvez toujours enregistrer facilement la dernière instance d'une commande. Si vous ne passez pas d'argument à getlast(c'est- à -dire, invoquez fcas fc -ln "" "", il affiche uniquement la dernière commande).

[Remarque: la réponse a été modifiée pour tenir compte du commentaire de @ Bram et du problème mentionné dans la réponse de @glenn jackman.]

camh
la source
5
Le premier formulaire fc -lnr | head -n 1peut être abrégé en fc -lnr -1.
Bram
@Bram: De bonnes choses. J'utilisais help fcpour ma documentation. La page de manuel bash contient plus de détails, y compris cette utilisation d'indices négatifs. L'élimination headest bonne car la seule commande restante est intégrée, il n'y a donc plus de fork / exec.
camh
1
Je me demande pourquoi la commande est appelée fc...
imz - Ivan Zakharyaschev
9

Un problème avec la réponse de @ camh est que si vous avez une commande qui s'étend sur plusieurs lignes, elle n'affiche que la première ligne:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Essaye ça:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"
glenn jackman
la source
3
l'activation cmdhistcorrigera cela: "S'il est défini, bash tente d'enregistrer toutes les lignes d'une commande sur plusieurs lignes dans la même entrée d'historique. Cela permet de rééditer facilement les commandes sur plusieurs lignes."
Mark McKinstry
2

Au lieu d'utiliser la flèche vers le haut, vous pouvez utiliser "!!"pour vous référer à la commande précédente.

par exemple

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

note: cela ne cite pas le texte littéral

ryanbraganza
la source
5
Cela ne capturera pas la commande littérale. S'il existe des métacaractères shell, ils seront évalués et remplacés. Les pipelines se briseront également: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh
0

Vous pouvez le faire avec la commande suivante si vous utilisez le shell bash:

$> history -a LOGBOOK

Cela ajoutera toutes vos commandes de la session en cours à ce fichier, vous pouvez également ajouter un alias sur votre fichier ~ / .bashrc pour le faire avec une seule commande:

$> alias getlast="history -a LOGBOOK"
stringbasic
la source
1
Mais vous manquez l'exigence la plus importante que je ne sauvegarde que les commandes qui ont fonctionné et obtenu les résultats que j'ai. Je ne veux pas enregistrer toutes les commandes récentes que j'ai faites, sélectionnez-en juste une après les avoir utilisées. Merci quand même.
MattLBeck