ไปที่คำสั่ง“ พิมพ์”


10

ฉันต้องการค้นหาคำสั่งหลายประเภท เป็นไปได้ที่จะไพพ์หรือxargsผลลัพธ์การค้นหาจากfindลงในtypeคำสั่งใน Linux?

ตัวอย่างเช่น:

find . -name anacron | type

หรือ

find . -name anacron | xargs type

ฉันคิดว่าคำตอบของ Oli เป็นคำตอบที่ดีที่สุด ความโกลาหลเพียงแค่ได้ผล แต่คำตอบของ Oli นั้นฉลาด
Helio

คำตอบ:


17

typeไม่ใช่คำสั่งปกติ มันเป็นบูตินเปลือก ดู:

$ type type
type is a shell builtin

ดังนั้นคุณจำเป็นต้องเรียกใช้bashด้วย-cเพื่อให้บรรลุสิ่งที่คุณต้องการ

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

หรือง่ายกว่า (ไม่ต้องการxargs):

$ find . -name anacron -exec bash -c "type {}"  \;

มันจะเรียกกับแฟ้มที่ถูกค้นพบโดยทุกbash -c "type ./file" ในความหมายเรากำหนดที่นี่เป็นตัวยึดตำแหน่งที่จะใช้ในภายหลัง ตัวยึดตำแหน่งนี้ถูกแทนที่ด้วยชื่อไฟล์ที่พบfind-Ixargs{}

ทำไม shell builtins ไม่ทำงานxargs:

[... ] คำสั่งในตัวมีอยู่ภายในเชลล์ เมื่อชื่อของคำสั่ง builtin ถูกใช้เป็นคำแรกของคำสั่งง่าย ๆ เชลล์จะเรียกใช้งานคำสั่งโดยตรงโดยไม่ต้องเรียกใช้โปรแกรมอื่น [ ... ]


xargs อ่านรายการจากอินพุตมาตรฐาน [... ] และดำเนินการคำสั่ง

คำสั่งในกรณีนี้เป็นแบบง่าย ๆ และเชลล์บิลด์อินนั้นไม่สามารถเรียกใช้งานได้ ไม่พบในระบบไฟล์ มันอยู่ภายในตัวเชลล์ ดังนั้นคุณต้องเรียกเชลล์และบอกเชลล์ที่เรียกเพื่อเรียกใช้คำสั่ง builtin bash -c "command"ว่าเกิดอะไรขึ้นกับ


3
คุณสามารถย่อให้เป็นfind ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru แน่นอนผมอ่านคำตอบของตัวเองอีกครั้งและเห็นว่ามัน =)
ความวุ่นวาย

11

มีปัญหาเล็กน้อยที่นี่ (บางปัญหาถูกเน้นไว้แล้ว):

  • typeเป็น builtin มันไม่ใช่คำสั่งที่ได้รับการแก้ไข แต่เป็นฟังก์ชั่นภายใน bash man bash-builtinsดู ใช้งานได้ในบริบทของ bash เท่านั้นจึงไม่ใช่subshell xargsหรือ-execforked
  • typeใช้เพื่อค้นหาเส้นทางของตนเอง หากคุณให้เส้นทาง (ตามที่findเคยทำ) มันอาจจะแค่คืนค่าเส้นทางนั้น readlink -fอาจจะดีกว่าถ้าคุณแค่พยายามแก้ไขลิงก์ และคุณสามารถท่อเข้าxargs readlinkหรือ-exec readlink -f {} +ตลอดทั้งวัน

ไม่ได้หมายความว่าคุณไม่สามารถทำสิ่งที่คุณต้องการได้ มีสองตัวเลือก typeคำสั่งสามารถจัดการรายชื่อหลายครั้งดังนั้นคุณก็สามารถให้มันชื่อทั้งหมดในครั้งเดียว:

type $(find /usr/sbin -name anacron)

สำหรับคำสั่งจำนวนมากหากมีข้อโต้แย้งมากเกินไปคุณจะเกินขีดจำกัดความยาวบรรทัดคำสั่ง (ดูgetconf ARG_MAX) อย่างไรก็ตามนั่นจะไม่นำมาใช้ในกรณีนี้เนื่องจากtypeถูกสร้างขึ้นในเชลล์และไม่ได้สร้าง ID กระบวนการใหม่ (ขีดจำกัดความยาวใช้กับฟังก์ชันexec () ที่ใช้โดยกระบวนการลูกในบรรทัดคำสั่งปกติ


1
ขอบคุณ Oli! ลินุกซ์มือใหม่คนนี้ได้เรียนรู้สิ่งใหม่ในวันนี้เกี่ยวกับ "ประเภท" และพฤติกรรมของมัน
LjinKazama
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.