อะไรคือความแตกต่างในการใช้“ ไฟล์สัมผัส” และ“> ไฟล์” ในการสร้างไฟล์ใหม่


13

ฉันยังใหม่กับ Linux เมื่อฉันสร้างไฟล์. gitignore ใหม่ภายใต้ไดเรกทอรีปัจจุบันโดยใช้ bash ฉันพบว่าฉันสามารถทำได้:

> .gitignore

หรือ

touch .gitignore

ดูเหมือนว่าพวกเขาทำในสิ่งเดียวกัน เมื่อผมตรวจสอบคู่มือสำหรับtouchมันบอกว่าการเปลี่ยนแปลงการประทับเวลาสำหรับแฟ้มปัจจุบัน >แต่ไม่มีคู่มือ ดังนั้นใครบางคนสามารถอธิบายสิ่งที่สามารถ>ทำได้และมีความแตกต่างในการใช้สองคำสั่งภายใต้บริบทนี้หรือไม่? ขอบคุณ


1
ฉันอยากรู้ว่าคุณเรียนรู้ที่จะใช้ '>' เป็นตัวสร้างไฟล์โดยไม่เรียนรู้การใช้งานได้อย่างไร
forresthopkinsa

1
คุณจะพบเอกสารการเปลี่ยนเส้นทางในคู่มือ Bash man bashที่บรรทัดคำสั่งให้ป้อนคำสั่ง มันเป็นเอกสารที่ยาวและต้องใช้เวลาหลายวันหรือหลายสัปดาห์กว่าจะเข้าใจได้ดี แต่มันก็คุ้มค่าหากคุณต้องการเรียนรู้ Bash อย่างละเอียด
Paddy Landau

คำตอบ:


21

>เป็นตัวดำเนินการเปลี่ยนเส้นทางเชลล์ ดูความแตกต่างระหว่าง ">" และ ">>" ในคำสั่ง shell คืออะไร และเมื่อใดที่ฉันควรใช้ <หรือ <() หรือ << และ> หรือ> () โดยส่วนใหญ่จะใช้เพื่อเปลี่ยนทิศทางเอาต์พุตของคำสั่งไปยังไฟล์ หากไม่มีไฟล์เชลล์จะสร้างขึ้น หากมีอยู่เชลล์จะตัดมันออก (ทำให้ว่างเปล่า) เพียงแค่> fileไม่มีคำสั่งดังนั้นเชลล์สร้างไฟล์ แต่ไม่มีการส่งออกไปยังมันดังนั้นผลกระทบสุทธิคือการสร้างไฟล์ว่างหรือล้างไฟล์ที่มีอยู่

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

พฤติกรรมของการ>ขึ้นอยู่กับเปลือก ใน bash, dash และ shell ส่วนใหญ่> fooจะทำงานได้ตามที่คุณคาดหวัง ใน zsh โดยค่าเริ่มต้นการ> fooทำงานเช่นcat > foo- zsh รอให้คุณพิมพ์ในการป้อนข้อมูล


10
จุดสำคัญที่นี่คือว่าไม่มีความแตกต่างระหว่างจริง>> fileและtouch fileแต่ถ้าfileไม่มีอยู่มีความแตกต่างใหญ่ระหว่างพวกเขาทั้งสองและ> file(ในที่เนื้อหาก่อนหน้าของfileหายไป) นั่นบวกกับพฤติกรรมที่ไม่สอดคล้องกันของค่าเฉลี่ยของ zsh touch fileคือ "ปลอดภัยที่สุด" ดังนั้นจึงควรจดจำว่าวิธีที่เหมาะสมในการทำเช่นนั้น
Monty Harder

1

นี่คือการเปรียบเทียบที่น่าสนใจ:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

ผลลัพธ์:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
ในขณะที่การเปรียบเทียบอาจน่าสนใจ แต่ฉันไม่เห็นสิ่งที่คุณต้องการให้ฉันเห็นที่นี่ คุณช่วยอธิบายสิ่งที่คุณกำลังจะทำอย่างไร ฉันคิดว่ามันเป็นวิธีที่แตกต่างในการเขียนเนื้อหาลงในไฟล์ แต่ฉันคิดว่ามันสับสนเล็กน้อยเช่นนี้ อาจเป็นเพราะฉันขาดกาแฟ
m00am

@ m00am สิ่งที่แสดงที่นี่มีประสิทธิภาพแตกต่างกัน 8 วิธีในการสร้างไฟล์ straceควรจะแสดงการเรียกระบบที่กำลังดำเนินการและ> file.txtวิธีการแสดงให้เห็นว่าจำนวนการเรียกใช้ระบบน้อยที่สุดซึ่งจริงๆแล้วไม่น่าแปลกใจเลย - ยิ่งเครื่องมือมีความซับซ้อนมากเท่าใด syscalls ก็จะยิ่งซับซ้อนมากขึ้นเท่านั้น ปัญหากับตัวอย่างที่แสดง แต่เป็นว่าstraceเขียนไปยังstderrสตรีมโดยค่าเริ่มต้นและในคำตอบนี้สตีเว่นใช้ท่อให้อ่านอย่างเดียวstderrดังนั้นฉันสับสนเล็กน้อยว่าเขานับเส้นโดยใช้|ท่อและไม่ได้|&
Sergiy Kolodyazhnyy

และใน Ubuntu 16.04 การใช้|&@Serg กล่าวถึงฉันได้รับการนับประมาณหนึ่งในห้าของที่นี่ ... ยกเว้นviกรณีที่ฉันได้รับค่าเดียวกัน
muru

WSL? ว้าว ... ฉันไม่คิดว่า WSL จะเพิ่มว่าระบบจำนวนมากเรียกร้องสิ่งที่มันทำ
muru

@muru Cygwin - WSL ยังไม่พร้อมstackoverflow.com/a/40370009
Steven Penny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.