ใครช่วยอธิบายความแตกต่างระหว่าง>และ>>เมื่อใช้คำสั่งเชลล์ได้ไหม
ตัวอย่าง:
ps -aux > log
ps -aux >> log
ดูเหมือนว่าผลลัพธ์จะเหมือนกันทั้งสองวิธี
ใครช่วยอธิบายความแตกต่างระหว่าง>และ>>เมื่อใช้คำสั่งเชลล์ได้ไหม
ตัวอย่าง:
ps -aux > log
ps -aux >> log
ดูเหมือนว่าผลลัพธ์จะเหมือนกันทั้งสองวิธี
คำตอบ:
>ใช้เพื่อเขียนทับ (“ clobber ”) ไฟล์และ>>ใช้เพื่อผนวกเข้ากับไฟล์
ดังนั้นเมื่อคุณใช้ps aux > fileเอาต์พุตของps auxจะถูกเขียนไปยังfileและหากไฟล์ที่มีชื่อfileมีอยู่แล้วเนื้อหานั้นจะถูกเขียนทับ
และถ้าคุณใช้ps aux >> fileการส่งออกของps auxจะถูกเขียนไปfileและหากไฟล์ชื่อfileอยู่แล้วในปัจจุบันไฟล์ในขณะนี้จะมีเนื้อหาก่อนหน้านี้และเนื้อหาของps aux, fileเขียนขึ้นหลังจากที่เนื้อหาเก่าของ
ถ้าคุณเขียนใน terminal
ps aux > log
มันจะใส่ผลลัพธ์ของps auxการเข้าสู่ระบบไฟล์ที่มีชื่อ
ถ้าคุณใส่
ps aux >> log
จากนั้นเอาต์พุตถัดไปจะถูกต่อท้ายด้านล่างอันแรก หากคุณใส่เพียงไฟล์เดียว>มันจะเขียนทับไฟล์ก่อนหน้า
ใช่>>ผนวก>เขียนทับ / ทำลายเนื้อหาก่อนหน้าเสมอ
ps -aux > log
เป็นเช่นเดียวกับ
rm log 2>/dev/null
ps -aux >> log
เมื่อวันที่ Wintel มันจะเหมือนกันสำหรับ.bat, .cmdและ.ps1สคริปต์เกินไป มรดกร่วมกันสามัญสำนึก
ความแตกต่างที่สำคัญที่สุดคือ>ทำให้เชลล์เปิดไฟล์หรือวัตถุที่มีลักษณะคล้ายไฟล์ที่มีO_WRONLY|O_CREAT|O_TRUNCแฟล็กไฟล์จะถูกสร้างหรือตัดทอนถ้ามีอยู่ขณะที่>>เปิดไฟล์ที่มีO_WRONLY|O_CREAT|O_APPENDแฟล็ก - ไฟล์จะถูกสร้างหรือต่อท้ายหากมีอยู่ สิ่งนี้จะชัดเจนหากคุณติดตามการโทรของระบบเช่น
$ strace -e open,dup2 bash -c 'true >> /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
และด้วย
$ strace -e open,dup2 bash -c 'true > /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
+++ exited with 0 +++
โปรดสังเกตว่าในทั้งสองกรณีตัวอธิบายไฟล์ของไฟล์ที่เปิดอยู่จะถูกทำซ้ำไปยังไฟล์ตัวอธิบาย 1 (stdout) ของคำสั่งและจะได้รับการสืบทอดโดยคำสั่งใด ๆ ก็ตามที่เชลล์ forks ใช้