Odpowiedzi:
Spróbuj tego faceta =):
sed -n 'line_num p' | bash
lub
"$(sed -n 'line_num p')"
line_num
i p
, więc na przykład jeśli line_num
jest to 123, możesz sed -n 123p | bash
. A jeśli sh
to wystarczy, po prostu użyj sh
zamiast bash
.
sed -n 'line_num p' | sh
może być inne rozwiązanie? Czy ten ma większą kompatybilność?
sh
faktycznie 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, bash
to prawie na pewno nie.
history
i zobaczę, że chcę uruchomić linię 900, czy mogę jakoś uruchomić linię 900?
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.
man history
history
jest 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”
Możesz to zrobić...
{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"
Otrzyma tylko $NUM
wiersz ze skryptu w zmiennej powłoki, $line
a 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/"$$"
eval
.
gnu sed
ma e
flagę, więc coś w stylu sed "${NUM}"'!d;s/^//e;q'
też by działało