วิธีรันบรรทัดที่มาจากผลลัพธ์ grep


10

ฉันมีไฟล์ข้อความพร้อมคำแนะนำในการติดตั้งและฉันรู้ว่าฉันสามารถ grep สำหรับเหตุการณ์ที่ไม่ซ้ำกันในไฟล์ ตัวอย่างเช่นไฟล์ข้อความมีลักษณะดังนี้:

MYDIR = `find / home / ชื่อผู้ใช้ somedir`
ส่งออก PERL5LIB = $ PERL5LIB: $ MYDIR

ในทุบตีฉันจะรันบรรทัดหลังจาก grep ในไฟล์ได้อย่างไร สิ่งที่ต้องการ:

เรียกใช้ผลลัพธ์จาก "grep somedir INSTALLFILE"
เรียกใช้ผลลัพธ์จาก "grep 'export PERL5LIB' INSTALLFILE"

2
การดำเนินการอัตโนมัติในแบบนี้ไม่อันตรายหรือไม่?
Faheem Mitha

2
@Faheem และ @avilella: มากกว่าบิตเล็ก ๆ ค่อนข้างอันตรายแน่นอน! นอกจากนี้ยังค่อนข้างบอบบาง
Caleb

คำตอบ:


4

สมมติฐาน:

  • คุณสามารถควบคุมไฟล์นี้และไม่อยู่ในอันตรายของรหัสที่เป็นอันตราย
  • คุณต้องการตั้งค่าตัวแปรเหล่านี้เปลือกปัจจุบันของคุณ

คุณสามารถเปลี่ยนเส้นทางคำสั่งของคุณไปยังไฟล์ temp และดำเนินการดังนี้:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

หรือคุณสามารถประเมินผลลัพธ์

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

กำลังอัปเดตคำตอบเก่า สิ่งที่ฉันจะทำในวันนี้คือการทดแทนกระบวนการ:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

โปรดทราบว่าสำหรับsource <(...)คุณต้องทุบตี 4 หรือสูงกว่า มันไม่ทำงานกับเวอร์ชั่นเก่ากว่า (zsh ก็โอเค)
Stéphane Chazelas

11

ในการประเมินบรรทัดในกระบวนการเชลล์แยก:

grep somedir INSTALLFILE | sh

ในการประเมินบรรทัดในกระบวนการเชลล์ที่รันอยู่:

eval "$(grep somedir INSTALLFILE)"

+1 สำหรับการเป็นผู้เดียวเท่านั้นที่ได้เห็นผืนป่าผ่านต้นไม้ ขอลบคำตอบของฉันด้วย @avilella: เพื่อความสะดวกคุณสามารถใช้-A 1หรือใช้-B 1แฟล็กบนหนึ่งหรืออีกอันgrepเพื่อดึงทั้งสองบรรทัดด้วย grep หนึ่งและใช้มันในโซลูชัน @Gilles อย่างใดอย่างหนึ่ง
Caleb

โปรดทราบว่าในบางระบบshอาจเป็นการเชื่อมโยงไปยังเชลล์อื่นแทนที่จะเป็นระบบที่คุณคาดหวังดังนั้นผลลัพธ์อาจไม่สามารถคาดเดาได้ เพื่อความปลอดภัยให้ระบุเชลล์ที่แน่นอนที่คุณคาดหวังเช่นgrep somedir INSTALLFILE | bash
thdoan

-2

คุณได้พิจารณาใช้คุณลักษณะ 'exec' ของ find as in:

find somedir -name INSTALLFILE -exec {}\;

ฉันคิดว่า OP กำลังมองหาเพื่อรันผลลัพธ์ที่กลับมาจาก grep grep ไม่ใช่การรันทุกผลลัพธ์ที่กลับมาจาก find
คาเลบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.