วิธีการแตกไฟล์และเอาท์พุทจากคำสั่ง?


32

โดยปกติคุณจะเขียน:

diff file1 file2

แต่ฉันต้องการ diff ไฟล์และผลลัพธ์จากคำสั่ง (ที่นี่ฉันทำให้คำสั่งเล็กน้อย):

diff file1 <(cat file2 | sort)

ตกลงงานนี้เมื่อฉันป้อนด้วยตนเองที่ shell prompt แต่เมื่อฉันใส่บรรทัดเดียวกันในเชลล์สคริปต์แล้วรันสคริปต์ฉันได้รับข้อผิดพลาด

ดังนั้นคำถามคือ - วิธีการทำอย่างถูกต้อง?

แน่นอนฉันต้องการหลีกเลี่ยงการเขียนผลลัพธ์ไปยังไฟล์ชั่วคราว

คำตอบ:


39

ฉันสงสัยว่าสคริปต์ของคุณและเปลือกของคุณแตกต่างกัน บางทีคุณอาจ#!/bin/shอยู่ด้านบนสุดของสคริปต์ในฐานะล่าม แต่คุณใช้bashเป็นเชลล์ส่วนตัว echo $SHELLคุณสามารถค้นหาสิ่งที่คุณเรียกใช้เปลือกในขั้วโดยการเรียกใช้

วิธีที่ง่ายกว่าในการทำเช่นนี้ซึ่งควรใช้กับเชลล์ส่วนใหญ่คือใช้การเปลี่ยนเส้นทางไปป์แทนตัวดำเนินการอ่านไฟล์ที่คุณให้ สัญลักษณ์ '-' เป็นระบบการตั้งชื่อมาตรฐานสำหรับการอ่าน STDIN และสามารถใช้แทนชื่อไฟล์ในรายการอาร์กิวเมนต์ได้บ่อย:

cat file2 | sort | diff file1 -

หรือเพื่อหลีกเลี่ยงการใช้แมวที่ไร้ประโยชน์ :

sort < file2 | diff file1 -

อาคุณเป็นคนดีจริง ๆ ฉันไม่ได้ตรวจสอบว่าดวลจุดโทษหรือไม่ ขอบคุณมากสำหรับการแก้ปัญหา
greenoldman

มันเป็นไฟล์ที่แตกต่างกับ stdout ตอนนี้วิธี diff stdout กับไฟล์? ฉันหมายถึงทิศทางตรงกันข้าม มัน-Rในกรณีของการใช้git diff --no-index
Nakilon

@Nakilon diff - file1คุณก็จะเปลี่ยนลำดับอาร์กิวเมนต์:
แม็กเคเล็บ

เย็น. git diffนี้ไม่ได้ทำงานให้
Nakilon

@Nakilon แน่นอนไม่ทำไมมันจะ? git diffเป็นสัตว์ที่แตกต่างอย่างสิ้นเชิงและดำเนินการเกี่ยวกับการอ้างอิงวัตถุ glob ในดัชนีภายในไม่ใช่ไฟล์; diffทำงานกับระบบไฟล์ -ไวยากรณ์เป็นเพียงเปลือกน้ำตาลประโยคสำหรับ/dev/stdinไฟล์ที่เป็นตัวแทนของกระแส STDIN ดังนั้นทำไมdiffสามารถใช้มันแทนชื่อไฟล์ ในขณะเดียวกันgit diffไม่ได้ค้นหาไฟล์มันกำลังค้นหาวัตถุดังนั้นคุณต้องผ่านบางสิ่งที่จำได้ อย่าใช้มันเพื่อเปรียบเทียบไฟล์ต่าง ๆ ใช้diffสำหรับสิ่งนั้น
Caleb

-4

ขอบเขตของอินพุตมาตรฐานเป็นสคริปต์ตัวเองดังนั้นเพียงแค่ใส่โค้ดของคุณใน blocku ดังนี้:

{
  diff file1 <(sort file2)
}

ด้วยวิธีนี้ขอบเขตของ STDIN จะอยู่ภายในบล็อก ..

ฉันลองแล้วใช้งานได้


นั่นไม่ใช่ฟังก์ชั่นมันเป็นบล็อกและมันก็ไม่ได้สร้างความแตกต่างเลย
Gilles 'หยุดความชั่วร้าย'

@gilles ขอบคุณสำหรับการแก้ไข BTW ฉันลองตัวเองแล้วใช้งานได้ ใช่มั้ย
tmow

3
บล็อกไม่มีผลต่อความถูกต้องของการ<(…)สร้าง สคริปต์ของคุณจะทำงานหรือไม่ทำงานขึ้นอยู่กับว่าคุณเรียกใช้ในเชลล์ที่สนับสนุน<(…)หรือไม่ (ksh93 / bash / zsh เทียบกับ Bourne / ash / kshk88) คำตอบของ Caleb ตอกย้ำทุกสิ่ง
Gilles 'หยุดความชั่วร้าย'

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