ใครช่วยอธิบายความแตกต่างระหว่าง>
และ>>
เมื่อใช้คำสั่งเชลล์ได้ไหม
ตัวอย่าง:
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 ใช้