นามแฝงอยู่ภายในเชลล์ที่กำหนดไว้ กระบวนการอื่นไม่สามารถมองเห็นได้ เช่นเดียวกันกับฟังก์ชั่นของเชลล์ xargsเป็นแอปพลิเคชันแยกต่างหากซึ่งไม่ใช่เชลล์ดังนั้นจึงไม่มีแนวคิดของนามแฝงหรือฟังก์ชัน
คุณสามารถทำให้ xargs เรียกใช้เชลล์แทนการเรียกใช้grepโดยตรง อย่างไรก็ตามการเรียกใช้เชลล์ไม่เพียงพอคุณต้องกำหนดนามแฝงในเชลล์นั้นด้วย หากนามแฝงถูกกำหนดในของ.bashrcคุณคุณสามารถแหล่งไฟล์นั้น อย่างไรก็ตามสิ่งนี้อาจไม่ทำงานของคุณ.bashrcทำงานอื่น ๆ ที่ไม่สมเหตุสมผลในเชลล์ที่ไม่มีการโต้ตอบ
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _
ระวังความซับซ้อนของข้อความที่ซ้อนกันเมื่อพิมพ์ regexp คุณสามารถทำให้ชีวิตของคุณง่ายขึ้นโดยส่ง regexp เป็นพารามิเตอร์ให้กับเชลล์
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here
คุณสามารถทำการค้นหานามแฝงได้อย่างชัดเจน แล้วจะเห็นxargsgrep -n --color=always
find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here
ใน zsh:
find . -name '*.py' | xargs $aliases[grep] regex_here
โดยวิธีการที่ทราบว่าfind … | xargs … การแบ่งในชื่อไฟล์ที่มีช่องว่าง (อื่น) คุณสามารถแก้ไขได้โดยเปลี่ยนเป็นเรคคอร์ดที่มีการคั่นด้วย null:
find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here
หรือโดยการใช้-exec:
find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +
แทนที่จะโทรfindคุณสามารถทำทุกอย่างภายในเชลล์ได้ รูปแบบ glob **/สำรวจภายในไดเรกทอรีซ้ำ ๆ ใน bash คุณต้องshopt -s globstarเปิดใช้งานเพื่อเปิดใช้งานรูปแบบ glob นี้ก่อน
grep regex_here **/*.py
ข้อ จำกัด บางประการ:
- หากไฟล์จำนวนมากตรงกัน (หรือหากไฟล์นั้นมีพา ธ ยาว) คำสั่งอาจล้มเหลวเนื่องจากเกินความยาวบรรทัดคำสั่งสูงสุด
- ใน bash ≤4.2 (แต่ไม่ใช่ในเวอร์ชันที่ใหม่กว่าหรือใน ksh หรือ zsh)
**/ให้เรียกใช้ลิงก์สัญลักษณ์ไปยังไดเรกทอรีอีกครั้ง
อีกวิธีหนึ่งคือการใช้การทดแทนกระบวนการตามที่ MariusMatutiaeแนะนำ
grep regex_here <(find . -name '*.py')
สิ่งนี้มีประโยชน์เมื่อ**/ไม่สามารถใช้ได้: สำหรับfindนิพจน์ที่ซับซ้อนหรือใน bash ≤4.2เมื่อคุณไม่ต้องการเรียกเก็บเงินภายใต้ลิงก์สัญลักษณ์ โปรดทราบว่าสิ่งนี้จะแบ่งในชื่อไฟล์ที่มีช่องว่าง วิธีแก้ปัญหาคือการตั้งค่าIFSและปิดใช้งานการวนรอบแต่มันเริ่มที่จะซับซ้อนเล็กน้อย:
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )