ฉันจะเรียกใช้บรรทัดที่ระบุเป็นคำสั่งในไฟล์ข้อความได้อย่างไร


11

บางครั้งฉันจำเป็นต้องสั่งคำสั่งเดียวซึ่งอยู่ในเชลล์สคริปต์

ฉันรู้แล้วว่าsed -n 'line_num p'สามารถพิมพ์บรรทัดนั้นได้ แต่ฉันจะ exec ที่พิมพ์บรรทัดที่เฉพาะเจาะจงเป็นคำสั่งได้อย่างไร

คำตอบ:


9

ลองเจ้านี่ =):

sed -n 'line_num p' | bash

หรือ

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

@mikeserv ฉันสนใจที่จะรู้บริบทของคำแถลงนั้นเพื่อการศึกษาของฉันเอง
Bratchley

ไม่จำเป็นต้องใส่ช่องว่างระหว่างline_numและpดังนั้นสำหรับตัวอย่างเช่นถ้าline_numเป็น 123 sed -n 123p | bashแล้วคุณสามารถ และถ้าshจะเพียงพอแล้วเพียงแค่ใช้แทนsh bash
janos

ดังนั้นsed -n 'line_num p' | shอาจเป็นทางออกอื่นได้หรือไม่ อันนี้มีความเข้ากันได้มากกว่าหรือไม่
Zen

1
@Zen - ขึ้นอยู่กับว่าเชลล์ใดที่มีการกำหนดเป้าหมายสำหรับสคริปต์ นอกจากนี้ยังขึ้นอยู่กับว่าเชลล์shคืออะไร ใน Debian (และมา)ระบบเป็นปกติsh dashหากสคริปต์ถูกเขียนขึ้นสำหรับdash (หรืออาศัยไวยากรณ์แบบพกพา)อาจเป็นไปได้ แต่ถ้ามันถูกเขียนขึ้นbashแล้วก็เกือบจะไม่แน่นอน
mikeserv

สามารถทำได้ด้วยไฟล์ประวัติเพื่อที่ว่าถ้าฉันทำงานhistoryและฉันเห็นว่าฉันต้องการเรียกใช้บรรทัด 900 ฉันสามารถเรียกใช้บรรทัด 900 ได้หรือไม่
codecowboy

3

หากคุณทำสิ่งนี้แบบโต้ตอบคุณสามารถเขียนบรรทัดลงในประวัติทุบตี:

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

จากนั้นกดEnterเพื่อแทรกบรรทัดลงในบัฟเฟอร์ Readline แล้วดำเนินการ ที่เปิดโอกาสให้คุณมองดูสายก่อนที่จะสายเกินไป


นั่นเป็นคนที่ฉลาดและอาจเป็นข้อสันนิษฐานที่ดี
mikeserv

ตัวเลือก -s นี้มีความหมายว่าอะไรที่นี่? ฉันไม่สามารถหาคำอธิบายได้man history
Zen

@zen: historyเป็นแบบในตัวดังนั้นจึงมีการบันทึกไว้ในhelp history(หรือman bashแต่มีการอ่านจำนวนมาก) การอ้างถึงข้างต้นhistory -sจะ "ผนวก ARGs เข้ากับรายการประวัติเป็นรายการเดียว"
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' เป็นคำที่สะกดผิดของ 'evil' หาก Eval เป็นคำตอบแน่นอนคุณกำลังถามคำถามที่ผิด ดูmywiki.wooledge.org/BashFAQ/048
Gilles Quenot

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.