เปิดและเขียนข้อมูลไปยังไฟล์ข้อความโดยใช้ Bash?


247

ฉันจะเขียนข้อมูลไปยังไฟล์ข้อความโดยอัตโนมัติด้วยการเขียนสคริปต์เชลล์ใน Linux ได้อย่างไร

ฉันสามารถเปิดไฟล์ได้ อย่างไรก็ตามฉันไม่ทราบวิธีการเขียนข้อมูล

คำตอบ:


410
echo "some data for the file" >> fileName

7
ชื่อของผู้ประกอบการนี้คืออะไร? ฉันต้องการหาคู่มือเกี่ยวกับมัน
Vlad T.

96
โอเปอเรเตอร์> เปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์แทนที่ไฟล์หากมีอยู่ >> จะผนวกเข้ากับไฟล์ที่มีอยู่
Triton Man

4
ขอบคุณนี่คือลิงค์ไปยังหน้า wiki ในกรณีที่มีคนต้องการen.wikipedia.org/wiki/…
Vlad T.

11
หากคุณต้องการทำสิ่งนี้ด้วยสิทธิ์พิเศษของรูทให้ทำแบบนี้:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
เกิดอะไรขึ้นถ้าข้อความของฉันเป็นสิ่งที่ต้องการนี้และด้วยเหตุผลใด ๆ ฉันไม่สามารถใช้curlหรือwget?
asedsami

145
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
 EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4 
EOM

1
Nice เอาท์พุทหลายบรรทัด
Federico Zancan

8
มือใหม่จะได้ประโยชน์จากการรู้ว่าจะทำอย่างไรกับไฟล์นี้ วิธีบันทึก, วิธีใช้งาน ฯลฯ
แดนนี่

14
โปรดอธิบายมากกว่าเพียงแค่วางโค้ด มันจะทำให้เป็นประโยชน์กับทุกคนมากขึ้นโดยเฉพาะมือใหม่
Casper B. Hansen

2
ในกรณีนี้สคริปต์ที่มีตัวแปรเช่น $ some_var จะหายไป จะแก้ไขอย่างไร?
ATrubka


60

คุณสามารถเปลี่ยนทิศทางเอาต์พุตของคำสั่งไปยังไฟล์:

$ cat file > copy_file

หรือผนวกเข้ากับมัน

$ cat file >> copy_file

หากคุณต้องการเขียนคำสั่งโดยตรง echo 'text'

$ echo 'Hello World' > file

3
หากคุณต้องการการอนุญาตรูท: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(ต้องขอบคุณความเห็นของลูเคอราทด้านบน)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
คำอธิบายรหัสของคุณจะช่วยให้ผู้อื่นสามารถใช้งานได้ง่ายขึ้น แม้แต่คำบรรยายภาพของคำศัพท์เช่น "here document" และ "redirection" สามารถชี้ผู้ค้นหาไปยังแหล่งข้อมูลอื่น ๆ
Palpatim

2
คำอธิบายไม่จำเป็นสำหรับบางสิ่งเช่นนี้
Bhargav Nanekalva

6
คำอธิบายไม่จำเป็นเมื่อคุณรู้คำตอบแล้ว สำหรับฉันรหัสด้านบนไม่เป็นประโยชน์เนื่องจากขาดรายละเอียด
Søren Ullidtz

ยังสามารถเพียงแค่ทำcat > FILE.txtแล้วกด Ctrl + D เมื่อคุณทำเสร็จแล้ว
เก่ง

1
หลังจาก EOF - ไม่ควรเว้นวรรค
ЮрийСветлов

24

ฉันรู้ว่านี่เป็นคำถามเก่า ๆ ที่น่ากลัว แต่เนื่องจาก OP เป็นเรื่องเกี่ยวกับการเขียนสคริปต์และสำหรับความจริงที่ว่า google นำฉันมาที่นี่การเปิดตัวอธิบายไฟล์สำหรับการอ่านและการเขียนในเวลาเดียวกันก็ควรได้รับการกล่าวถึงเช่นกัน

#!/bin/bash

# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt

    # Let's print some text to fd 3
    echo "Roses are red" >&3
    echo "Violets are blue" >&3
    echo "Poems are cute" >&3
    echo "And so are you" >&3

# Close fd 3
exec 3>&-

จากนั้นcatไฟล์ใน terminal

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

ตัวอย่างนี้ทำให้ไฟล์ poem.txt เปิดให้อ่านและเขียนบน file descriptor 3 นอกจากนี้ยังแสดงให้เห็นว่ากล่อง * nix รู้ถึง fd มากขึ้นแล้วแค่ stdin, stdout และ stderr (fd 0,1,2) มันถือจริงมาก โดยปกติแล้วจำนวนไฟล์อธิบายสูงสุดที่เคอร์เนลสามารถจัดสรรสามารถพบได้ใน/proc/sys/file-maxหรือ/proc/sys/fs/file-maxแต่การใช้ fd ด้านบน 9 เป็นอันตรายเพราะมันอาจขัดแย้งกับ fd ที่เชลล์ใช้ภายใน ดังนั้นอย่ากังวลและใช้เฉพาะ fd's 0-9 เท่านั้น หากคุณต้องการตัวอธิบายไฟล์มากกว่า 9 ไฟล์ในสคริปต์ทุบตีคุณควรใช้ภาษาอื่นต่อไป :)

อย่างไรก็ตาม fd สามารถใช้ในวิธีที่น่าสนใจมากมาย


14

ฉันชอบคำตอบนี้:

cat > FILE.txt <<EOF

info code info 
...
EOF

แต่จะแนะนำcat >> FILE.txt << EOFถ้าคุณต้องการเพิ่มบางสิ่งบางอย่างในตอนท้ายของไฟล์โดยไม่ต้องลบสิ่งที่มีอยู่แล้ว

แบบนี้:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
เพิ่มคำอธิบายพร้อมคำตอบสำหรับวิธีที่คำตอบนี้ช่วย OP ในการแก้ไขปัญหาปัจจุบัน
Kяσѕρєя K

9

การย้ายความคิดเห็นของฉันเป็นคำตอบตามที่ @lycono ร้องขอ

หากคุณต้องการทำสิ่งนี้ด้วยสิทธิ์พิเศษของรูทให้ทำดังนี้:

sudo sh -c 'echo "some data for the file" >> fileName'

6
คุณอาจต้องการหลีกเลี่ยงการรันรูทเชลล์สำหรับพิมพ์สตริง พยายามที่echo "some data for the file" | sudo tee -a fileName >/dev/nullจะเรียกใช้teeเป็นรากเท่านั้น
tripleee

6

สำหรับสภาพแวดล้อมที่ไม่มีเอกสารที่นี่ ( Makefile,, Dockerfileฯลฯ ) คุณมักจะสามารถใช้printfเพื่อแก้ปัญหาที่ชัดเจนและมีประสิทธิภาพ

printf '%s\n' '#!/bin/sh' '# Second line' \
    '# Third line' \
    '# Conveniently mix single and double quotes, too' \
    "# Generated $(date)" \
    '# ^ the date command executes when the file is generated' \
    'for file in *; do' \
    '    echo "Found $file"' \
    'done' >outputfile

1
ความคิดเห็นของคุณด้านบนลองสะท้อน "ข้อมูลบางอย่างสำหรับไฟล์" | sudo tee -a ชื่อไฟล์> / dev / null เพื่อรัน tee เป็น root เท่านั้น มีประโยชน์จริง ๆ !
Kojo

5

ฉันคิดว่ามีคำตอบที่ดีอย่างสมบูรณ์ แต่ก็ไม่มีข้อสรุปที่เป็นไปได้ทั้งหมด ดังนี้:

หลักหลักที่อยู่เบื้องหลังคำตอบมากที่สุดนี่คือการเปลี่ยนเส้นทาง สองตัวดำเนินการเปลี่ยนเส้นทางที่สำคัญสำหรับการเขียนไปยังไฟล์:

เปลี่ยนเส้นทางเอาท์พุท:

echo 'text to completely overwrite contents of myfile' > myfile

ผนวกเอาต์พุตที่เปลี่ยนเส้นทาง

echo 'text to add to end of myfile' >> myfile

เอกสารที่นี่

คนอื่นพูดถึงแทนที่จะมาจากแหล่งอินพุตคงที่เช่นecho 'text'คุณสามารถเขียนโต้ตอบไฟล์ผ่าน "Here Document" ซึ่งมีรายละเอียดในลิงก์ไปยังคู่มือทุบตีด้านบน คำตอบเหล่านั้นเช่น

cat > FILE.txt <<EOF หรือ cat >> FILE.txt <<EOF

ใช้ประโยชน์จากโอเปอเรเตอร์การเปลี่ยนเส้นทางเดียวกัน แต่เพิ่มเลเยอร์อื่นผ่าน "เอกสารที่นี่" ในไวยากรณ์ข้างต้นคุณเขียนถึง file.txt catผ่านการส่งออกของ การเขียนจะเกิดขึ้นหลังจากอินพุตอินเทอร์แอคทีฟได้รับสตริงเฉพาะบางอย่างเท่านั้นในกรณีนี้ 'EOF' แต่อาจเป็นสตริงใด ๆ ก็ได้เช่น:

cat > FILE.txt <<'StopEverything' หรือ cat >> FILE.txt <<'StopEverything'

ก็จะทำงานได้เช่นกัน ที่นี่เอกสารยังมองหาตัวคั่นต่างๆและอักขระการแยกวิเคราะห์ที่น่าสนใจอื่น ๆ ดังนั้นให้ดูที่เอกสารสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น

ที่นี่เงื่อนไข

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

การเปลี่ยนเส้นทางเอาต์พุตของ cat Input

cat > myfile <<<'text to completely overwrite contents of myfile'

ผนวกเอาต์พุตที่เปลี่ยนเส้นทางของอินพุต cat

cat >> myfile <<<'text to completely overwrite contents of myfile'


0

ยังสามารถใช้ที่นี่เอกสารและ vi สคริปต์ด้านล่างสร้าง FILE.txt ที่มี 3 บรรทัดและการแก้ไขตัวแปร

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

จากนั้นไฟล์จะมี 3 บรรทัดดังต่อไปนี้ "i" คือการเริ่มโหมดแทรก vi และในทำนองเดียวกันเพื่อปิดไฟล์ด้วย Esc และ ZZ

#This is my var in text file
var = Test
#Thats end of text file

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