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?

Zen
la source

Réponses:

9

Essayez ce gars =):

sed -n 'line_num p' | bash

ou

"$(sed -n 'line_num p')"
Gilles Quenot
la source
@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.

rici
la source
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/"$$"
mikeserv
la source
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

Walter A
la source
-2

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

for line in $(cat file.txt); do command $line; done
Yan
la source