Come posso eseguire una riga specifica come comando in un file di testo?


11

A volte ho bisogno di eseguire un singolo comando che si trova in uno script di shell.

So già che sed -n 'line_num p'può stampare quella linea. Ma come posso eseguire quella riga stampata specifica come comando?

Risposte:


9

Prova questo ragazzo =):

sed -n 'line_num p' | bash

o

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

@mikeserv Sono interessato a conoscere il contesto di quella dichiarazione per la mia educazione.
Bratchley,

Non è necessario inserire uno spazio tra line_nume p, quindi ad esempio se line_numè 123, è possibile sed -n 123p | bash. E se shè abbastanza, basta usare shinvece di bash.
Janos,

Quindi, sed -n 'line_num p' | shpotrebbe essere un'altra soluzione? Questo ha più compatibilità?
Zen,

1
@Zen - dipende da quale shell è destinata allo script. Dipende anche da cosa shsia effettivamente la shell . Su Debian (e derivati) sistemi shdi solito dash. Se lo script è scritto per dash (o altrimenti si basa su una sintassi portatile) , probabilmente, sì, ma se è scritto per bashquasi sicuramente no.
Mikeserv,

questo potrebbe essere fatto con il file di cronologia in modo che se corro historye vedo che voglio eseguire la linea 900, posso eseguire la linea 900 in qualche modo?
codecowboy,

3

Se lo stai facendo in modo interattivo, potresti scrivere la riga nella cronologia di bash:

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

Quindi premere Enterper inserire la linea nel buffer readline ed eseguirla; che ti dà la possibilità di dare un'occhiata alla linea prima che sia troppo tardi.


È abbastanza intelligente, e probabilmente una buona supposizione.
Mikeserv,

cosa significa questa opzione qui? Non riesco a trovare spiegazioni inman history
Zen

@zen: historyè un built-in, quindi è documentato in help history(o man bash, ma è un sacco di lettura). Citando quanto sopra, history -s"aggiungerà gli ARG all'elenco cronologico come una singola voce"
rici

2

Tu puoi fare...

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

Ciò otterrà solo la $NUMriga dallo script nella variabile shell $linee quindi la valuterà come comando nella shell corrente.

Un altro modo per farlo potrebbe apparire come:

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

1
"eval" è un errore ortografico comune di "male". Se eval è la risposta, sicuramente stai ponendo la domanda sbagliata. Vedi mywiki.wooledge.org/BashFAQ/048
Gilles Quenot

1
Sì. Tutti amano eval.
Mikeserv,

gnu sedha la ebandiera, quindi qualcosa del genere sed "${NUM}"'!d;s/^//e;q'funzionerebbe anche
don_crissti,

2

Stai modificando il tuo script con vim (vi su Linux)? In vi aggiungere una mappatura:

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

e successivamente quando sei sulla linea interessante in vi premi F4


-2

In bash puoi eseguire il seguente comando:

for line in $(cat file.txt); do command $line; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.