เหตุใดจึงไม่มีคำสั่ง shell เพื่อสร้างไฟล์


27

สนใจโปรด:

ฉันไม่ได้ถามวิธีการสร้างไฟล์จากบรรทัดคำสั่ง!


ฉันใช้touchสำหรับทำไฟล์มาหลายปีโดยไม่สนใจว่าจุดประสงค์หลักของมันคืออย่างอื่น หากต้องการสร้างไฟล์จากบรรทัดคำสั่งมีความเป็นไปได้มากมาย:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

และฉันแน่ใจว่ามีมากขึ้น

แต่ความจริงคือไม่มีคำสั่งใด ๆ ข้างต้นที่ได้รับการออกแบบมาเพื่อสร้างไฟล์ ตัวอย่างเช่นman touchแนะนำคำสั่งนี้เพื่อเปลี่ยนการประทับเวลาไฟล์ ทำไมระบบปฏิบัติการถึงไม่สมบูรณ์เหมือน Unix (หรือ Linux) มีคำสั่งที่ออกแบบมาเพื่อสร้างไฟล์


35
ทำไมคุณถึงทำให้ระบบยุ่งเหยิงเพื่อเพิ่มคำสั่งให้ทำบางสิ่งที่สามารถทำได้หลายวิธีด้วยเครื่องมือที่มีอยู่แล้ว?
Michael Kohne

4
เหตุใดจึงไม่มีคำสั่งให้อ่านไฟล์จาก / ถึงสตรีม / stdin / out ทุกคนใช้คำสั่งที่มีไว้สำหรับการหลอกลวงcat!
เอสเอฟ

2
@MichaelKohne ฉันเห็นจุดของคุณด้วยความเคารพทุกอย่างฉันมีปัญหากับมัน ด้วยวิธีการนี้มีคำสั่งมากมายที่ทำให้ระบบยุ่งเหยิง ทำไมต้องใช้moreเมื่อlessทำมากกว่าสิ่งที่moreทำ!? หรือและdir lsถึงแม้ว่าฉันตระหนักถึงปัญหาความเข้ากันได้
Pouya

9
morelessถือกำเนิดสร้าง ได้ถูกสร้างขึ้นมาโดยเฉพาะเพื่อข้อบกพร่องอยู่ของless ยังคงมีอยู่เนื่องจากเหตุผลด้านความเข้ากันได้แบบย้อนหลัง และสำหรับจุดประสงค์และจุดประสงค์ส่วนใหญ่ปฏิบัติการเดียวกัน - พวกเขาต่างกันเพียงไม่กี่ไบต์ เครื่องมือใหม่ที่ตั้งใจมาโดยเฉพาะสำหรับการสร้างไฟล์จะทำน้อยกว่าเครื่องมือที่มีอยู่และเป็นเช่นนั้นมันจะเป็นความถดถอยไม่ได้ปรับตัวดีขึ้นเช่นในกรณีของVS moremoredirlslessmore
lanzz

1
ยิ่งกว่านั้นเราต้องดูที่มรดกระบบ Unix ถูกสร้างขึ้นเมื่อนับจำนวนแต่ละไบต์ เหตุใดจึงสร้างยูทิลิตี้สำหรับงานที่คุณสามารถทำได้ด้วยยูทิลิตี้ที่มีอยู่แล้ว?
โทมัส

คำตอบ:


38

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

ไม่มีประโยชน์อย่างแน่นอนในการสร้างไฟล์ก่อนจากนั้นใช้การเปลี่ยนเส้นทาง I / O เพื่อเขียนไฟล์หากคุณสามารถทำได้ในขั้นตอนเดียว

ในกรณีที่คุณต้องการสร้างไฟล์เปล่าและทิ้งไว้ฉันขอยืนยันว่า> "${file}"ไม่น่าจะสวยและสง่างามกว่า

TL; DR : มันไม่มีอยู่เพราะการสร้างไฟล์เปล่าส่วนใหญ่มักจะไม่มีประโยชน์และในกรณีที่มันมีตัวเลือกมากมายอยู่แล้วเพื่อให้บรรลุเป้าหมายนี้

ในหมายเหตุด้านการใช้touchงานได้เฉพาะถ้าไฟล์ไม่มีอยู่ในขณะที่ตัวเลือกที่ใช้การเปลี่ยนเส้นทางจะตัดทอนไฟล์เสมอแม้ว่าจะมีอยู่แล้ว (ในทางเทคนิคแล้วโซลูชันเหล่านั้นจะไม่เหมือนกัน) > fooเป็นวิธีที่แนะนำเนื่องจากประหยัดforkและecho -nควรหลีกเลี่ยงโดยทั่วไปเนื่องจากไม่สามารถพกพาได้สูง


1
ฉันพบจุดของคุณเกี่ยวกับการสร้างไฟล์แล้วใช้เครื่องมือ I / O ที่แข็งแกร่งมาก ขอขอบคุณ.
Pouya

1
@FaheemMitha ใช่ ( >>) >ฉันหมายถึงตัวอย่างที่ได้รับจากการใช้ OP การต่อท้ายจะไม่มีประโยชน์อะไรเลยหากสิ่งที่คุณเป็นหลังจากนั้นคือการสร้างไฟล์ (หรือ NOOP out หากมีอยู่)
Adrian Frühwirth

1
อย่าลืมว่าไม่ได้noclobberมีการตั้งค่าเพื่อที่>จะเขียนทับไฟล์ที่มีอยู่
Ouki

1
@Ouki AFAIK การตั้งค่าที่ไม่ใช่พฤติกรรมเริ่มต้นและอาจลืมได้ว่าตั้งค่าไว้ในระบบเดียวและไม่ใช่ระบบอื่นอาจนำไปสู่ปัญหาในแบบเดียวกับที่การสร้างalias rm='rm -i'แทนที่จะalias rmi='rm -i'เป็นความคิดที่ไม่ดี
Agi Hammerthief

1
@mikeserv, บนบรรทัดคำสั่งเพียงอย่างเดียวจะทำอย่างนั้นสมบูรณ์ดีโดยไม่ต้อง> .file :
Charles Duffy

16

คำตอบของ Adrian Frühwirthนั้นถูกต้อง mktempฉันแค่อยากจะเพิ่มว่ามีจริงคำสั่งที่เขียนขึ้นมาโดยเฉพาะเพื่อสร้างไฟล์:

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

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

ที่กล่าวว่าคุณยังมีtruncateและfallocateทั้งสองมีวัตถุประสงค์ที่สำคัญคือการสร้างไฟล์ พวกเขามีวิธีการที่ซับซ้อนมากขึ้น จะไม่มีโปรแกรมที่ง่ายที่จะทำอะไรไม่ได้เนื่องจากมีวิธีที่มันจะดีกว่าไม่มี> file> file


11

เครื่องมือเชลล์พื้นฐานส่วนใหญ่ไม่ได้ออกแบบมาเพื่อวัตถุประสงค์เฉพาะใด ๆ เลย เครื่องมือเชลล์พื้นฐานส่วนใหญ่ได้รับการออกแบบเพื่อโต้ตอบกับผู้อื่นเพื่อให้บรรลุวัตถุประสงค์ของคุณเท่านั้น หรืออาจจะกล่าวได้ว่าเครื่องมือส่วนใหญ่ทำสิ่งพื้นฐานเพียงอย่างเดียวโดยไม่คำนึงว่าพวกเขาจะรวมกันอย่างไรเพื่อให้บรรลุเป้าหมาย

: >./file

ที่สร้างไฟล์เปล่า หรือตัดทอนไฟล์ที่มีอยู่ตามที่คุณต้องการ คุณสามารถ:

set -o noclobber

เพื่อหลีกเลี่ยงความเป็นไปได้ของกรณีหลังเว้นแต่คุณ:

: >|./file

คุณสามารถรับพฤติกรรมที่คล้ายคลึงกับ touchกับ:

: >>./file
: >>|./file

ยกเว้นว่า:จะไม่อัปเดต modtime ของไฟล์เพราะจะไม่มีการแก้ไข

การสาธิต

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

เอาท์พุท

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

ไม่สัมผัส

: >>|./echo.file
ls -l 

เอาท์พุท

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

โดยค่าเริ่มต้น echo เพิ่ม\nในตอนท้ายของบรรทัด ลองecho -n >echo-n.file(ขนาด = 0) และecho -e >echo-e.file(ขนาด = 1)
โทมัส

@Thomas 'สตริงที่จะเขียนไปยังเอาต์พุตมาตรฐาน หากตัวถูกดำเนินการแรกคือ -n หรือถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งมีอักขระเครื่องหมายทับขวา ('\') ผลลัพธ์จะถูกกำหนดโดยการนำไปปฏิบัติ บนระบบที่สอดคล้องกับ XSI หากตัวถูกดำเนินการแรกคือ -n จะต้องถูกใช้เป็นสตริงไม่ใช่ตัวเลือก ลำดับอักขระต่อไปนี้จะได้รับการยอมรับในระบบที่สอดคล้องกับ XSI ภายในข้อโต้แย้งใด ๆ ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

ยุติธรรมพอขอบคุณสำหรับลิงค์และความคิดเห็นของฉันไม่ได้เป็นจุดต่อไป
โทมัส

2
ใช่แน่นอนและฉันหมายความว่าความคิดเห็นของฉันหายไปจากคำตอบของคุณต่อไปขอโทษด้วย
โทมัส

1
ภาพประกอบของแนวโน้ม Unix catที่จะพูดคุยเป็นความจริงที่ว่าคำสั่งเพื่อแสดงเนื้อหาของแฟ้มที่เรียกว่า เหตุใดจึงมีคำสั่งให้แสดงหนึ่งไฟล์เมื่อคุณสามารถสร้างคำสั่งเดียวเพื่อเชื่อมหลายไฟล์เข้ากับเอาต์พุตมาตรฐานได้
200_success

1

ยูทิลิตี้installถูกออกแบบมาสำหรับการสร้างไฟล์จริง! คุณสามารถส่งผ่านเนื้อหาของไฟล์ผ่าน/dev/stdin(ในกรณีส่วนใหญ่อย่างไรก็ตามในรสชาติส่วนใหญ่ของ Linux สิ่งนี้จำเป็นต้อง/procมีการเมาท์) หรือให้ไฟล์ต้นฉบับอื่น คุณสามารถตั้งค่าความเป็นเจ้าของและสิทธิ์ได้

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

เป็นตัวอย่างที่โง่

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