นามแฝงอยู่ภายในเชลล์ที่กำหนดไว้ กระบวนการอื่นไม่สามารถมองเห็นได้ เช่นเดียวกันกับฟังก์ชั่นของเชลล์ 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
คุณสามารถทำการค้นหานามแฝงได้อย่างชัดเจน แล้วจะเห็นxargs
grep -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') )