Як я можу запустити певний рядок як команду в текстовому файлі?


11

Іноді мені потрібно виконати одну команду, яка знаходиться в сценарії оболонки.

Я вже знаю, що sed -n 'line_num p'може надрукувати цей рядок. Але як я можу виконати цей друкований рядок як команду?

Відповіді:


9

Спробуйте цього хлопця =):

sed -n 'line_num p' | bash

або

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

@mikeserv Мені цікаво знати контекст цієї заяви для моєї власної освіти.
Братчлі

Не потрібно ставити пробіл між, line_numі p, наприклад, якщо line_num123, тоді ви можете 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

Якщо ви робите це інтерактивно, ви можете записати рядок в історію баш:

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

Потім натисніть, Enterщоб вставити рядок у буфер для читання рядків, і виконайте його; це дає вам можливість поглянути на лінію, перш ніж пізно.


Це досить розумно, і, ймовірно, хороше припущення.
мікесерв

що означає цей варіант -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/"$$"

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)? In vi додайте відображення:

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

а потім, коли ви перебуваєте на цікавій лінійці, натисніть F4


-2

У bash можна виконати таку команду:

for line in $(cat file.txt); do command $line; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.