ฉันต้องการค้นหาคำสั่งหลายประเภท เป็นไปได้ที่จะไพพ์หรือxargsผลลัพธ์การค้นหาจากfindลงในtypeคำสั่งใน Linux?
ตัวอย่างเช่น:
find . -name anacron | type
หรือ
find . -name anacron | xargs type
ฉันต้องการค้นหาคำสั่งหลายประเภท เป็นไปได้ที่จะไพพ์หรือxargsผลลัพธ์การค้นหาจากfindลงในtypeคำสั่งใน Linux?
ตัวอย่างเช่น:
find . -name anacron | type
หรือ
find . -name anacron | xargs type
คำตอบ:
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"ว่าเกิดอะไรขึ้นกับ
find ... -exec bash -c 'type "$@"' _ {} +
มีปัญหาเล็กน้อยที่นี่ (บางปัญหาถูกเน้นไว้แล้ว):
typeเป็น builtin มันไม่ใช่คำสั่งที่ได้รับการแก้ไข แต่เป็นฟังก์ชั่นภายใน bash man bash-builtinsดู ใช้งานได้ในบริบทของ bash เท่านั้นจึงไม่ใช่subshell xargsหรือ-execforkedtypeใช้เพื่อค้นหาเส้นทางของตนเอง หากคุณให้เส้นทาง (ตามที่findเคยทำ) มันอาจจะแค่คืนค่าเส้นทางนั้น readlink -fอาจจะดีกว่าถ้าคุณแค่พยายามแก้ไขลิงก์ และคุณสามารถท่อเข้าxargs readlinkหรือ-exec readlink -f {} +ตลอดทั้งวันไม่ได้หมายความว่าคุณไม่สามารถทำสิ่งที่คุณต้องการได้ มีสองตัวเลือก typeคำสั่งสามารถจัดการรายชื่อหลายครั้งดังนั้นคุณก็สามารถให้มันชื่อทั้งหมดในครั้งเดียว:
type $(find /usr/sbin -name anacron)
สำหรับคำสั่งจำนวนมากหากมีข้อโต้แย้งมากเกินไปคุณจะเกินขีดจำกัดความยาวบรรทัดคำสั่ง (ดูgetconf ARG_MAX) อย่างไรก็ตามนั่นจะไม่นำมาใช้ในกรณีนี้เนื่องจากtypeถูกสร้างขึ้นในเชลล์และไม่ได้สร้าง ID กระบวนการใหม่ (ขีดจำกัดความยาวใช้กับฟังก์ชันexec () ที่ใช้โดยกระบวนการลูกในบรรทัดคำสั่งปกติ