Làm cách nào tôi có thể chạy một dòng cụ thể dưới dạng một lệnh trong tệp văn bản?


11

Đôi khi tôi cần phải thực thi một lệnh trong kịch bản shell.

Tôi đã biết sed -n 'line_num p'có thể in dòng đó. Nhưng làm thế nào tôi có thể thực thi dòng in cụ thể đó như một lệnh?

Câu trả lời:


9

Hãy thử anh chàng này =):

sed -n 'line_num p' | bash

hoặc là

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

@mikeerv Tôi muốn biết về bối cảnh của tuyên bố đó cho giáo dục của riêng tôi.
Bratchley

Không cần đặt một khoảng trắng giữa line_nump, ví dụ nếu line_numlà 123, thì bạn có thể sed -n 123p | bash. Và nếu shlà đủ, sau đó chỉ cần sử dụng shthay vì bash.
janos

Vì vậy, sed -n 'line_num p' | shcó thể là một giải pháp khác? Là cái này có nhiều khả năng tương thích?
Zen

1
@Zen - điều đó phụ thuộc vào shell nào được nhắm mục tiêu cho tập lệnh. Nó cũng phụ thuộc vào vỏ shthực sự là gì. Trên hệ thống Debian (và dẫn xuất)sh thường là dash. Nếu tập lệnh được viết cho dash (hoặc nói cách khác là dựa vào cú pháp di động) thì có lẽ, vâng, nhưng nếu nó được viết cho bashthì gần như chắc chắn là không.
mikeerv

điều này có thể được thực hiện với tệp lịch sử để nếu tôi chạy historyvà tôi thấy rằng tôi muốn chạy dòng 900, tôi có thể chạy dòng 900 bằng cách nào không?
codecowboy

3

Nếu bạn đang làm điều này một cách tương tác, bạn có thể viết dòng vào lịch sử bash:

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

Sau đó nhấn Enterđể chèn dòng vào bộ đệm readline và thực hiện nó; điều đó cho bạn cơ hội liếc nhìn dòng trước khi quá muộn.


Đó là khá thông minh, và có lẽ là một giả định tốt.
mikeerv

tùy chọn này có ý nghĩa gì ở đây? Tôi không thể tìm thấy lời giải thích trongman history
Zen

@zen: historylà một tích hợp, vì vậy nó được ghi lại trong help history(hoặc man bash, nhưng đó là rất nhiều đọc). Trích dẫn ở trên, history -ssẽ "nối thêm các ĐỐI_SỐ vào danh sách lịch sử như một mục duy nhất"
rici

2

Bạn có thể làm...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

Điều đó sẽ chỉ nhận được $NUMdòng từ tập lệnh của bạn trong biến shell $linevà sau đó đánh giá nó như một lệnh trong shell hiện tại.

Một cách khác để làm điều này có thể trông giống như:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
'eval' là một lỗi chính tả phổ biến của 'ác'. Nếu eval là câu trả lời, chắc chắn bạn đang hỏi sai câu hỏi. Xem mywiki.wooledge.org/BashFAQ/048
Gilles Quenot

1
Vâng Mọi người đều yêu thích eval.
mikeerv

gnu sedecờ nên thứ gì đó cũng sed "${NUM}"'!d;s/^//e;q'sẽ hoạt động
don_crissti

2

Bạn đang chỉnh sửa tập lệnh của mình bằng vim (vi trên Linux)? Trong vi thêm ánh xạ:

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

và sau đó khi bạn đang ở trên dòng thú vị trong vi, hãy nhấn F4


-2

Trong bash bạn có thể chạy lệnh sau:

for line in $(cat file.txt); do command $line; done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.