Как я могу запустить определенную строку как команду в текстовом файле?

11

Иногда мне нужно выполнить одну команду из сценария оболочки.

Я уже знаю, sed -n 'line_num p'может напечатать эту строку. Но как я могу выполнить эту распечатанную строку как команду?

Zen
источник

Ответы:

9

Попробуй этого парня =)

sed -n 'line_num p' | bash

или

"$(sed -n 'line_num p')"
Жиль Квено
источник
@mikeserv Мне интересно знать контекст этого заявления для моего собственного образования.
Братчли
Не нужно ставить пробел между line_numи p, например, если line_numэто 123, то вы можете sed -n 123p | bash. И если этого shдостаточно, то просто используйте shвместо bash.
Janos
Итак, sed -n 'line_num p' | shможет быть другое решение? У этого больше совместимости?
Дзен
1
@Zen - это зависит от того, какая оболочка предназначена для скрипта. Это также зависит от того, какая оболочка на shсамом деле. На Debian (и производных) системах shэто обычно dash. Если сценарий написан для dash (или иным образом основан на переносимом синтаксисе), то, вероятно, да, но если он написан для, bashто почти наверняка нет.
mikeserv
Можно ли это сделать с помощью файла истории, чтобы, если я запускаю historyи вижу, что хочу запустить строку 900, могу ли я как-нибудь запустить строку 900?
codecowboy
3

Если вы делаете это в интерактивном режиме, вы можете написать строку в истории Bash:

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

Затем нажмите, Enterчтобы вставить строку в буфер readline и выполнить ее; это дает вам возможность взглянуть на линию, пока не стало слишком поздно.

RICi
источник
Это довольно умно, и, вероятно, хорошее предположение.
mikeserv
что означает этот параметр -s здесь? Я не могу найти объяснения вman history
Дзен
@zen: historyвстроенный, так что задокументирован help history(или man bash, но это много читается). Цитируя вышеизложенное, history -s«добавлю ARG в список истории как одну запись»
rici
2

Ты можешь сделать...

{ 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/"$$"
mikeserv
источник
1
«eval» - это обычное неправильное написание слова «зло». Если ответом является eval, вы наверняка задаете не тот вопрос. См. Mywiki.wooledge.org/BashFAQ/048
Жиль Квено
1
Ага. Все любят eval.
mikeserv
gnu sedимеет eфлаг, чтобы что-то вроде sed "${NUM}"'!d;s/^//e;q'бы тоже работало
don_crissti
2

Вы редактируете свой скрипт с помощью vim (vi в Linux)? В vi добавьте отображение:

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

а потом, когда вы находитесь на интересной линии в vi нажмите F4

Вальтер А
источник
-2

В bash вы можете запустить следующую команду:

for line in $(cat file.txt); do command $line; done
Ян
источник