echo "text" >> 'Users/Name/Desktop/TheAccount.txt'
ฉันจะสร้างมันอย่างไรเพื่อที่จะสร้างไฟล์หากมันไม่มีอยู่ แต่จะเขียนทับมันถ้ามันมีอยู่แล้ว ตอนนี้สคริปต์นี้เพิ่งต่อท้าย
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'
ฉันจะสร้างมันอย่างไรเพื่อที่จะสร้างไฟล์หากมันไม่มีอยู่ แต่จะเขียนทับมันถ้ามันมีอยู่แล้ว ตอนนี้สคริปต์นี้เพิ่งต่อท้าย
คำตอบ:
ความเข้าใจเล็กน้อยเกี่ยวกับวิธีการทำงานของ * nix pipes จะช่วยได้
ในระยะสั้น>>
ผู้ดำเนินการเปลี่ยนเส้นทางจะผนวกบรรทัดต่อท้ายไฟล์ที่ระบุโดยที่มากกว่า>
จะว่างเปล่าและเขียนทับไฟล์
echo "text" > 'Users/Name/Desktop/TheAccount.txt'
-bash: TheAccount.txt: cannot overwrite existing file
สภาพแวดล้อมบางอย่างไม่อนุญาตให้กับสิ่งที่ต้องการ
>
และ>>
เป็นผู้ประกอบการเปลี่ยนเส้นทางการส่งออก |
ประกอบท่อ
>|
เพื่อบังคับเขียนทับที่มีอยู่
ใน Bash หากคุณตั้งค่า noclobber a set -o noclobber
แล้วคุณจะใช้ไวยากรณ์>|
ตัวอย่างเช่น:
echo "some text" >| existing_file
วิธีนี้สามารถใช้งานได้หากไฟล์ยังไม่มีอยู่
&>| file
ทำงาน คุณใช้เชลล์และรุ่นอะไร @ กระตุ้นให้ zsh ทั้งคู่ทำงานได้ดีเพราะทุบตีเท่านั้น>|
echo "aaa" &>| test.txt
-bash: syntax error near unexpected token |
noclobber ของฉันตั้งไว้ที่
echo "aaa" >| test.txt 2>&1
หรือใช้เปลือกหอยอื่น
แม้จะมีNylonSmile
คำตอบซึ่งก็คือ "เรียงลำดับ" ถูกต้อง .. ฉันไม่สามารถเขียนทับไฟล์ได้ในลักษณะนี้ ..
echo "i know about Pipes, girlfriend" > thatAnswer
zsh: file exists: thatAnswer
การแก้ปัญหาของฉัน .. ผมต้องใช้ ... >!
, a la ..
[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"
เห็นได้ชัดว่าระวังด้วย ...
NOCLOBBER
ชุดตัวเลือก zsh ที่ไม่ใช่ค่าเริ่มต้น ใช้setopt clobber
เพื่อเรียกคืนพฤติกรรมเริ่มต้น
หากสภาพแวดล้อมของคุณไม่อนุญาตให้เขียนทับด้วย>
ให้ใช้ไพพ์|
และtee
แทนดังนี้:
echo "text" | tee 'Users/Name/Desktop/TheAccount.txt'
หมายเหตุสิ่งนี้จะพิมพ์ไปยัง stdout ด้วย ในกรณีที่ไม่พึงประสงค์คุณสามารถเปลี่ยนเส้นทางการส่งออก/dev/null
เป็นดังนี้:
echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null
#!/bin/bash
cat <<EOF > SampleFile
Put Some text here
Put some text here
Put some text here
EOF
เพียงสังเกตว่าหากคุณต้องการเปลี่ยนทั้ง std :: cerr และ std :: cout ไปยังไฟล์ในขณะที่คุณมี noclobber set (เช่นset -o noclobber
) คุณสามารถใช้รหัสได้:
cmd >|file.txt 2>&1
ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถมองเห็นที่https://stackoverflow.com/a/876242
นอกจากนี้ยังมีคำถาม @ TuBui ของคำตอบสำหรับคำตอบ @BrDaHa ที่ให้ไว้ข้างต้นในวันที่ 9 ส.ค. 18 ที่ 9:34
หากต้องการเขียนทับเนื้อหาของไฟล์หนึ่งไปยังไฟล์อื่น ใช้แมวเช่น
echo "this is foo" > foobar.txt
cat foobar.txt
echo "this is bar" > bar.txt
cat bar.txt
ตอนนี้เพื่อเขียนทับ foobar เราสามารถใช้คำสั่ง cat ดังต่อไปนี้
cat bar.txt >> foobar.txt
cat foobar.txt
>>
กำลังจะผนวกไม่เขียนทับ
หากคุณมีเอาต์พุตที่อาจมีข้อผิดพลาดคุณอาจต้องการใช้เครื่องหมายและและมากกว่าดังนี้:
my_task &> 'Users/Name/Desktop/task_output.log'
สิ่งนี้จะเปลี่ยนเส้นทางทั้ง stderr และ stdout ไปยังไฟล์บันทึก (แทนที่จะเป็น stdout เท่านั้น)