¿Cómo puedo ejecutar una línea específica como comando en un archivo de texto?

11

A veces necesito ejecutar un solo comando que está en un script de shell.

Ya sé que sed -n 'line_num p'puede imprimir esa línea. Pero, ¿cómo puedo ejecutar esa línea impresa específica como un comando?

zen
fuente

Respuestas:

9

Prueba este chico =):

sed -n 'line_num p' | bash

o

"$(sed -n 'line_num p')"
Gilles Quenot
fuente
@mikeserv Estoy interesado en conocer el contexto de esa declaración para mi propia educación.
Bratchley
No es necesario poner un espacio entre line_numy p, por ejemplo, si line_numes 123, puede hacerlo sed -n 123p | bash. Y si shes suficiente, simplemente use en shlugar de bash.
janos
Entonces, ¿ sed -n 'line_num p' | shpodría ser otra solución? ¿Este tiene más compatibilidad?
Zen
1
@Zen: eso depende de a qué shell se dirija el script. También depende de qué shell sea shrealmente. En Debian (y derivados) sistemas shes generalmente dash. Si el script está escrito dash (o de lo contrario se basa en la sintaxis portátil), entonces probablemente sí, pero si está escrito, bashentonces definitivamente no.
mikeserv
¿podría hacerse esto con el archivo de historial para que si ejecuto historyy veo que quiero ejecutar la línea 900, puedo ejecutar la línea 900 de alguna manera?
codecowboy
3

Si está haciendo esto de manera interactiva, podría escribir la línea en el historial de bash:

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

Luego presione Enterpara insertar la línea en el buffer de línea de lectura y ejecútelo; eso te da la oportunidad de mirar la línea antes de que sea demasiado tarde.

rici
fuente
Eso es bastante inteligente, y probablemente una buena suposición.
mikeserv
¿Qué significa esta opción -s aquí? No puedo encontrar explicaciones enman history
Zen
@zen: historyestá integrado, por lo que está documentado en help history(o man bash, pero eso es mucha lectura). Citando lo anterior, history -s"agregará los ARG a la lista del historial como una sola entrada"
rici
2

Tu puedes hacer...

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

Eso obtendrá solo la $NUMlínea de su script en la variable de shell $liney luego la evaluará como un comando en el shell actual.

Otra forma de hacer esto podría ser:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"
mikeserv
fuente
1
'eval' es un error ortográfico común del 'mal'. Si eval es la respuesta, seguramente está haciendo la pregunta incorrecta. Ver mywiki.wooledge.org/BashFAQ/048
Gilles Quenot
1
Sip. Todos aman eval.
mikeserv
gnu sedtiene la ebandera así que algo así sed "${NUM}"'!d;s/^//e;q'también funcionaría
don_crissti
2

¿Estás editando tu script con vim (vi en Linux)? En vi agregue un mapeo:

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

y luego cuando estés en la línea interesante en vi presiona F4

Walter A
fuente
-2

En bash puedes ejecutar el siguiente comando:

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