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