Comment puis-je exécuter une ligne spécifique en tant que commande dans un fichier texte?


11

Parfois, j'ai besoin d'exécuter une seule commande qui se trouve dans un script shell.

Je sais déjà que je sed -n 'line_num p'peux imprimer cette ligne. Mais comment puis-je exécuter cette ligne spécifique imprimée en tant que commande?

Réponses:


9

Essayez ce gars =):

sed -n 'line_num p' | bash

ou

"$(sed -n 'line_num p')"

@mikeserv Je suis intéressé à connaître le contexte de cette déclaration pour ma propre éducation.
Bratchley

Pas besoin de mettre un espace entre line_numet p, donc par exemple si line_numest 123, alors vous pouvez sed -n 123p | bash. Et si cela shsuffit, utilisez simplement shau lieu de bash.
janos

Alors, sed -n 'line_num p' | shpourrait être une autre solution? Est-ce que celui-ci a plus de compatibilité?
Zen

1
@Zen - cela dépend du shell ciblé pour le script. Cela dépend aussi de ce qu'est shréellement le shell . Sur les systèmes Debian (et dérivés) , shc'est généralement le cas dash. Si le script est écrit pour dash (ou repose autrement sur une syntaxe portable), alors probablement, oui, mais s'il est écrit pour, bashalors certainement pas.
mikeserv

cela pourrait-il être fait avec le fichier d'historique de sorte que si je lance historyet que je vois que je veux exécuter la ligne 900, puis-je exécuter la ligne 900 d'une manière ou d'une autre?
codecowboy

3

Si vous faites cela de manière interactive, vous pouvez écrire la ligne dans l'historique de bash:

history -s "$(sed -n 'line_num p')"

Appuyez ensuite sur Enterpour insérer la ligne dans le tampon de ligne de lecture et exécutez-la; qui vous donne une chance de regarder la ligne avant qu'il ne soit trop tard.


C'est assez intelligent, et probablement une bonne hypothèse.
mikeserv

que signifie cette option -s ici? Je ne trouve pas d'explications dansman history
Zen

@zen: historyest intégré, il est donc documenté dans help history(ou man bash, mais c'est beaucoup de lecture). Citant ce qui précède, history -s"ajoutera les ARG à la liste d'historique comme une seule entrée"
rici

2

Tu peux faire...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

Cela n'obtiendra que la $NUMligne de votre script dans la variable shell $line, puis l'évaluera comme une commande dans le shell actuel.

Une autre façon de procéder pourrait ressembler à ceci:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
«eval» est une faute d'orthographe courante de «evil». Si eval est la réponse, vous posez sûrement la mauvaise question. Voir mywiki.wooledge.org/BashFAQ/048
Gilles Quenot

1
Ouaip. Tout le monde aime eval.
mikeserv

gnu seda le edrapeau donc quelque chose comme ça sed "${NUM}"'!d;s/^//e;q'marcherait aussi
don_crissti

2

Modifiez-vous votre script avec vim (vi sous Linux)? Dans vi, ajoutez un mappage:

:nmap <F4> Y:!<C-R>"<C-H><CR>

et ensuite quand vous êtes sur la ligne intéressante de vi, appuyez sur F4


-2

Dans bash, vous pouvez exécuter la commande suivante:

for line in $(cat file.txt); do command $line; done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.