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.