Exécuter le script bash depuis vim

21

J'utilise vim pour les scripts bash. la chose est parfois que je ne veux pas créer un nouveau fichier, le rendre exécutable, l'exécuter puis le supprimer. Je veux dire les scripts qui ne seront utilisés qu'une seule fois.

Par exemple, j'ouvre vim et tape ceci:

#!/bin/bash

ll | while read line
do
    echo $line
done

Je n'ai pas enregistré ce fichier, j'utilise simplement vim pour simplifier le script bash. Je sais que je peux exécuter une commande bash via !dans vim. Mais qu'en est-il de l'exécution de tout ce qui se trouve dans le tampon?

St.Antario
la source
4
Vous savez que vous pouvez modifier la ligne de commande actuelle dans Vim avec <C-x><C-e>et l'exécuter en écriture, non?
romainl
Si vous exécutez bash avec cette option set -o vi, vous pouvez appuyer sur Esc-vpour modifier la ligne de commande dans vi. Ensuite, Esc-:wqpour exécuter.
roblogic

Réponses:

36

J'ai écrit une réponse assez détaillée à ce sujet sur stack-overflow . L'idée de base est que, puisque la commande d' écriture concerne l' écriture et non l' enregistrement , vous pouvez écrire le texte de votre tampon dans un programme externe, tel que python ou bash. Dans votre cas, vous voudriez faire quelque chose comme:

:w !bash

ou

:w !sh

Ces commandes écrivent littéralement le texte de votre tampon directement dans le programme que vous spécifiez !, ce qui est pratique car vous n'avez pas besoin d'enregistrer un fichier. Bien sûr, vous pouvez également faire quelque chose comme:

:w | !bash %

qui enregistre votre fichier, puis l'exécute en tant que script bash. Vous pouvez choisir celui qui vous convient le mieux.

DJMcMayhem
la source
Existe-t-il un moyen de fournir des options un argument de cette façon? J'ai essayé :w !bash -a testmais j'ai obtenu "ne peut pas exécuter le fichier binaire"
St.Antario
@ St.Antario Hmm. Je suis sûr qu'il doit y avoir un moyen, mais mon bash est assez rouillé (j'utilise principalement des fenêtres). Lorsque j'essaie cela dans cygwin avec un testfichier vide , cela fonctionne bien pour moi. Que doit faire la commande et que doit-elle testcontenir?
DJMcMayhem
Mon cas réel est assez compliqué, alors laissez-le simplement imprimer l'argument transmis. BTW, que voulez-vous dire ce qui devrait test contenir? testest juste un argument pour -a.
St.Antario
1
@ St.Antario Oh, OK je vois. Je pensais que testc'était censé être un fichier. Je ne sais pas trop quoi faire. Si vous essayez quelque chose de complexe, il peut être préférable de simplement l'enregistrer dans un fichier. Il pourrait être utile de poser une question distincte afin que vous puissiez fournir plus de détails. Ce serait probablement aussi une bonne question pour Unix et Linux
DJMcMayhem
4

Scénario: vous travaillez dans le shell bash. Tout d'abord, assurez-vous que le mode d'édition local est vi:

$ set -o vi

Maintenant, lorsque vous vous retrouvez à travailler sur une commande longue comme la suivante, appuyez sur Esc+ v.

$ fjhwfq this is my long command

Cela chargera votre commande dans une visession temporaire . Maintenant, vous pouvez le modifier comme vous le souhaitez, et même ajouter une autre commande ...

fjhwfq some long command
ls -l

Une fois la modification terminée, tapez Esc :wqet la ou les commandes seront exécutées, par exemple:

$ fjhwfq some long command
fjhwfq some long command
bash: fjhwfq: command not found
ls -l
total 44
-rw-r--r-- 1 ropata Domain Users 24073 Nov 10 14:17 _viminfo
drwxr-xr-x 1 ropata Domain Users     0 Jul 15 13:57 bin/
-rw-r--r-- 1 ropata Domain Users   956 Nov  7 10:43 custom_env
roblogic
la source
3
pourrait ne pas fonctionner si vous avez un nouveau macbook sans Escclé;)
roblogic
1
Les nouveaux MacBooks n'ont pas de Escclés!? Comment peuvent-ils alors utiliser Vim?
Hubro
1
Maintenant , je l' ai essayé, le nouveau macbook barre tactile thingy fait apparaître une Escclé lors de l' exécution Vim dans un terminal.
roblogic