Відповіді:
Спробуйте цього хлопця =):
sed -n 'line_num p' | bash
або
"$(sed -n 'line_num p')"
line_numі p, наприклад, якщо line_num123, тоді ви можете sed -n 123p | bash. А якщо shдостатньо, то просто використовуйте shзамість bash.
sed -n 'line_num p' | shможе бути інше рішення? Це більше сумісності?
shнасправді оболонка . У Debian (і похідних) системах shзазвичай dash. Якщо сценарій написаний для dash (або іншим чином покладається на портативний синтаксис), то, ймовірно, так, але якщо він написаний для bashцього, то майже напевно немає.
historyі бачу, що хочу запустити рядок 900, чи можу я якось запустити рядок 900?
Якщо ви робите це інтерактивно, ви можете записати рядок в історію баш:
history -s "$(sed -n 'line_num p')"
Потім натисніть, ↑Enterщоб вставити рядок у буфер для читання рядків, і виконайте його; це дає вам можливість поглянути на лінію, перш ніж пізно.
man history
historyце вбудований, тому він задокументований у help history(або man bash, але це багато читається). Цитуючи вищесказане, " history -sдодадуть ARG до списку історії як єдиний запис"
Ви можете зробити...
{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"
Це отримає лише $NUMрядок з вашого сценарію в змінній оболонки, $lineа потім оцінить його як команду в поточній оболонці.
Ще один спосіб зробити це може виглядати так:
</path/to/script sed "${NUM}q;d" >/tmp/"$$"
. /tmp/"$$" ; rm /tmp/"$$"
eval.
gnu sedмає eпрапор, тож щось подібне sed "${NUM}"'!d;s/^//e;q'також спрацювало б