บางครั้งฉันจำเป็นต้องสั่งคำสั่งเดียวซึ่งอยู่ในเชลล์สคริปต์
ฉันรู้แล้วว่าsed -n 'line_num p'สามารถพิมพ์บรรทัดนั้นได้ แต่ฉันจะ exec ที่พิมพ์บรรทัดที่เฉพาะเจาะจงเป็นคำสั่งได้อย่างไร
บางครั้งฉันจำเป็นต้องสั่งคำสั่งเดียวซึ่งอยู่ในเชลล์สคริปต์
ฉันรู้แล้วว่าsed -n 'line_num p'สามารถพิมพ์บรรทัดนั้นได้ แต่ฉันจะ exec ที่พิมพ์บรรทัดที่เฉพาะเจาะจงเป็นคำสั่งได้อย่างไร
คำตอบ:
ลองเจ้านี่ =):
sed -n 'line_num p' | bash
หรือ
"$(sed -n 'line_num p')"
line_numและpดังนั้นสำหรับตัวอย่างเช่นถ้าline_numเป็น 123 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เพื่อแทรกบรรทัดลงในบัฟเฟอร์ Readline แล้วดำเนินการ ที่เปิดโอกาสให้คุณมองดูสายก่อนที่จะสายเกินไป
man history
historyเป็นแบบในตัวดังนั้นจึงมีการบันทึกไว้ในhelp history(หรือman bashแต่มีการอ่านจำนวนมาก) การอ้างถึงข้างต้นhistory -sจะ "ผนวก ARGs เข้ากับรายการประวัติเป็นรายการเดียว"
คุณทำได้...
{ 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'จะใช้งานได้เช่นกัน
คุณกำลังแก้ไขสคริปต์ด้วย vim (vi บน Linux) หรือไม่ ใน vi เพิ่มการแมป:
:nmap <F4> Y:!<C-R>"<C-H><CR>
และหลังจากนั้นเมื่อคุณอยู่ในบรรทัดที่น่าสนใจใน vi กด F4
ใน bash คุณสามารถเรียกใช้คำสั่งต่อไปนี้:
for line in $(cat file.txt); do command $line; done