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?

Odpowiedzi:


9

Spróbuj tego faceta =):

sed -n 'line_num p' | bash

lub

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

@ 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.


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/"$$"

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


-2

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

for line in $(cat file.txt); do command $line; done
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.