web-dev-qa-db-fra.com

mettre la commande historique dans la ligne de commande sans l'exécuter

J'utilise! N où (n) est le numéro de ligne pour exécuter une ligne dans le fichier d'historique que je souhaite exécuter à l'invite de commande que je trouve via l'historique | Moins.

Mais il y a un événement d'historique de ligne de commande que je souhaite modifier manuellement. Comment puis-je insérer dans la ligne de commande un contenu d'événements d'historique sans qu'elle s'exécutent, je peux donc modifier puis appuyer sur RETURN?

Meilleur,

59
Vass

Pour demander que la commande soit imprimée plutôt que d'exécuter après la substitution d'historique, ajoutez le :pmodificateur , par ex. !42:p. La commande résultante sera également entrée dans l'historique afin que vous puissiez appuyer sur Up pour le modifier.

Si vous avez le histverifyoption SET (shopt -s histverify), vous aurez toujours la possibilité de modifier le résultat des substitutions d'histoire.

Le fc _ intégré donne un accès limité à l'expansion de l'historique (aucun concepteur de mot) et vous permet de modifier une commande précédente dans un éditeur externe.

Vous pouvez utiliser !prefix Pour faire référence à la dernière commande en commençant par prefix et !?substring Pour faire référence à la dernière commande en commençant par substring. Lorsque vous savez ce que vous recherchez, cela peut économiser beaucoup de temps sur history | less.

Une autre façon de chercher à travers l'historique précédent est la recherche progressive: appuyez sur Ctrl+R et commencez à entrer une sous-chaîne de ce que vous recherchez. presse Ctrl+R aller à la présence précédente de la chaîne de recherche jusqu'à présent et Ctrl+S Si vous êtes allé trop loin. La plupart des clés autres que Ctrl+RCtrl+SBackspace et les caractères ordinaires mettent fin à la recherche incrémentielle et ont leur effet habituel (par exemple les touches fléchées pour déplacer le curseur dans la ligne que vous avez atteinte, Enter exécuter la commande).

Un autre petit: Alt+#

commentaires sur la ligne actuelle et le déplace dans le tampon d'historique.

Ainsi, lorsque vous assemblez une ligne de commande et que vous devez émettre une commande intermédiaire vers E.G. Trouver un fichier, vous venez de frapper Alt+#, Émettez l'autre commandement, montez dans l'histoire, déformant et procédez.

15
Rahul Patil

Vous pouvez utiliser un espace magique pour développer l'historique avant de frapper l'entrée. Dans votre .Inputtrc, carte de la carte dans l'espace magique:

$if Bash
     Space: magic-space
$endif

Maintenant, chaque fois que vous tapez un espace après une spécification d'historique, il sera immédiatement élargi - pratique si vous souhaitez le modifier aussi!

7
Cascabel

Jetez un coup d'œil à la history-expand-line commande, liée à Alt+^ par défaut. Il élargira la ligne mise en place que vous pouvez ensuite éditer.

7
Alex Barrett

À l'aide de Ctrl+r Vous pouvez rechercher l'historique:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Toute commande que vous trouvez pourrait être éditée ...


Je pense que j'ai trouvé exactement ce dont vous avez besoin: courir shopt -s histverify et la prochaine fois que vous voulez utiliser !n la commande ne sera pas exécutée mais uniquement à la ligne de commande ...

4
pbm

J'ai souvent voulu cela. Quand j'ai utilisé CSH (et TCSH), j'ai eu un idiome:
[.____] !:88*:p

Cet idiome insère "Word 88 à travers le dernier mot" de la commande précédente au point où vous tapez sur la ligne de commande actuelle, qui est typiquement la fin. Dans CSH, ce n'est pas une erreur pour une telle expression ne produisant aucun mot. C'est-à-dire qu'il n'est pas nécessaire de ne pas être un mot 88, ni celui qui le suive. S'il n'y a pas de mot 88, cela n'ajoute aucun mot à la fin de la commande saisi, puis appuie la ligne de commande résultante dans l'historique sans exécution.

Comme vous le savez probablement,
[.____] *! (comme !! et! -1) est la commande précédente;
[.____] *: 88 est Word 88 (le premier mot - typiquement la commande - est zéro) et le CSH nécessiterait un tel mot, mais ...
[.____] *: 88 * Est-ce que tous les mots commençant par Word 88, puis CSH n'exige pas que le mot existe;
[.____] *: p signifie imprimer, mais n'exécute pas la ligne de commande.
[.____] avec ou sans le: P, la ligne de commande est ajoutée à l'historique de la commande.

"Pourquoi 88?" vous vous demandez? Parce que c'est la même clé que le *, j'aurai besoin. Si vous avez des commandes aussi longtemps, peut-être!: 888 *: P est ce dont vous avez besoin. Désolé cela ne fonctionne pas avec Bash Afaik. Bash va simplement dire bash: :88*: bad Word specifier

Fait amusant: votre commande n'a généralement pas besoin d'être la première.
[.____] > /tmp/foo echo My command is Word 3
[.____] est valable dans Bash et CSH.

1
W Dean Stanton

J'utilise normalement Ctrl+r pour rechercher et ensuite Ctrl+e aller à la fin de la ligne sans exécuter.

0
nikc