Jak uruchomić określoną linię jako polecenie w pliku tekstowym?

11

Czasami muszę wykonać jedno polecenie w skrypcie powłoki.

Wiem już, że sed -n 'line_num p'mogę wydrukować tę linię. Ale jak mogę wykonać ten wydrukowany wiersz jako polecenie?

Zen
źródło

Odpowiedzi:

9

Spróbuj tego faceta =):

sed -n 'line_num p' | bash

lub

"$(sed -n 'line_num p')"
Gilles Quenot
źródło
@ mikeserv Interesuje mnie znajomość kontekstu tego oświadczenia dla mojej własnej edukacji.
Bratchley,
Nie musisz wstawiać spacji między line_numi p, więc na przykład jeśli line_numjest to 123, możesz sed -n 123p | bash. A jeśli shto wystarczy, po prostu użyj shzamiast bash.
Janos
Czy sed -n 'line_num p' | shmoże być inne rozwiązanie? Czy ten ma większą kompatybilność?
Zen
1
@Zen - zależy to od tego, która powłoka jest przeznaczona dla skryptu. Zależy to również od tego, czym shfaktycznie jest powłoka . W systemach Debian (i pochodnych)sh jest zwykle dash. Jeśli skrypt jest napisany dla dash (lub w inny sposób opiera się na przenośnej składni), prawdopodobnie tak, ale jeśli jest napisany dla, bashto prawie na pewno nie.
mikeserv
czy można tego dokonać z plikiem historii, aby jeśli uruchomię historyi zobaczę, że chcę uruchomić linię 900, czy mogę jakoś uruchomić linię 900?
codecowboy
3

Jeśli robisz to interaktywnie, możesz zapisać wiersz w historii bash:

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

Następnie naciśnij, Enteraby wstawić linię do bufora readline i wykonać ją; daje to szansę rzucić okiem na linię, zanim będzie za późno.

rici
źródło
To całkiem sprytne i prawdopodobnie dobre założenie.
mikeserv
co oznacza tutaj ta opcja -s? Nie mogę znaleźć wyjaśnień wman history
Zen
@zen: historyjest wbudowany, więc jest udokumentowany w help history(lub man bash, ale to dużo czytania). Cytując powyższe, history -s„doda ARG do listy historii jako pojedynczy wpis”
rici,
2

Możesz to zrobić...

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

Otrzyma tylko $NUMwiersz ze skryptu w zmiennej powłoki, $linea następnie oceni go jako polecenie w bieżącej powłoki.

Innym sposobem na to może wyglądać:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"
mikeserv
źródło
1
„eval” jest powszechnym błędem w pisowni „zła”. Jeśli odpowiedź brzmi eval, z pewnością zadajesz złe pytanie. Zobacz mywiki.wooledge.org/BashFAQ/048
Gilles Quenot
1
Tak. Wszyscy kochają eval.
mikeserv
gnu sedma eflagę, więc coś w stylu sed "${NUM}"'!d;s/^//e;q'też by działało
don_crissti
2

Czy edytujesz swój skrypt za pomocą vima (vi w systemie Linux)? W vi dodaj mapowanie:

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

a następnie, gdy znajdziesz się na ciekawej linii w vi, naciśnij F4

Walter A.
źródło
-2

W bash możesz uruchomić następujące polecenie:

for line in $(cat file.txt); do command $line; done
Yan
źródło