Bash kullanarak veriyi metin dosyasına açma ve yazma?


247

Linux'ta kabuk komut dosyası oluşturarak bir metin dosyasına otomatik olarak nasıl veri yazabilirim?

Dosyayı açabildim. Ancak, veriyi nasıl yazacağımı bilmiyorum.

Yanıtlar:


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

7
Bu operatörün adı nedir? Bununla ilgili bir el kitabı bulmak istiyorum.
Vlad T.

96
operatör> çıktıyı dosyanın varsa üzerine yazılan bir dosyaya yönlendirir. >> mevcut bir dosyaya eklenecektir.
Triton Man

4
Teşekkür ederim, işte wiki sayfasının bağlantısı, birinin ihtiyacı olması durumunda en.wikipedia.org/wiki/…
Vlad T.

11
Bunu kök ayrıcalıklarıyla yapmanız gerekiyorsa, şu şekilde yapın:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
Metnim böyle bir şeyse ve herhangi bir nedenle curlya da kullanamam 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
Çok satırlı çıktı almak güzel.
Federico Zancan

8
Yeni başlayanlar bu dosyayla tam olarak ne yapılacağını bilmekten faydalanırlar. Nasıl kaydedilir, nasıl çalıştırılır, vb.
Danny

14
Lütfen bir kod parçası koymak yerine açıklayınız. Herkes için - özellikle yeni başlayanlar - çok daha yararlı olur.
Casper B. Hansen

2
Bu durumda, $ some_var gibi değişkenleri olan komut dosyaları kaybolur. Nasıl düzeltilebilir?
ATrubka


60

Bir komutun çıktısını bir dosyaya yeniden yönlendirebilirsiniz:

$ cat file > copy_file

ya da ona ekle

$ cat file >> copy_file

Doğrudan yazmak istiyorsanız komut echo 'text'

$ echo 'Hello World' > file

3
Kök iznine ihtiyacınız varsa: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(lukaserat'ın yukarıdaki yorumu sayesinde)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
Kodunuzun açıklaması, kodu başkaları için daha kullanışlı hale getirmek için uzun bir yol kat edecektir. "Burada belge" ve "yönlendirme" gibi kelime bilgisi bile arama yapan kişileri diğer kaynaklara yönlendirebilir.
Palpatim

2
Bunun gibi bir şey için açıklama gerekli değildir.
Bhargav Nanekalva

6
Cevabı zaten bildiğinizde açıklama asla gerekli değildir. Bana göre yukarıdaki kod detayların eksikliği nedeniyle yararlı değildir.
Søren Ullidtz


1
EOF'dan sonra - boşluk olmamalıdır.
Юрий Светлов

24

Bunun çok eski bir soru olduğunu biliyorum, ancak OP komut dosyası yazmakla ilgili olduğundan ve google'ın beni buraya getirdiği için, aynı zamanda okuma ve yazma için dosya tanımlayıcılarının açılması da belirtilmelidir.

#!/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>&-

Sonra catterminaldeki dosya

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

Bu örnek poem.txt dosyasının dosya tanımlayıcı 3'te okuma ve yazma için açık olmasına neden olur. Aslında çok şey tutuyor. Genellikle, çekirdeğin ayırabileceği maksimum dosya tanımlayıcı sayısı bulunabilir /proc/sys/file-maxveya /proc/sys/fs/file-max9'un üzerinde herhangi bir fd kullanmak, kabuk tarafından dahili olarak kullanılan fd'lerle çakışabileceğinden tehlikelidir. Bu yüzden rahatsız etmeyin ve sadece fd 0-9 kullanın. Bir bash betiğinde daha fazla 9 dosya tanıtıcısına ihtiyacınız varsa, yine de farklı bir dil kullanmalısınız :)

Her neyse, fd'ler birçok ilginç şekilde kullanılabilir.


14

Bu cevabı beğendim:

cat > FILE.txt <<EOF

info code info 
...
EOF

ancak cat >> FILE.txt << EOFzaten var olanları silmeden dosyanın sonuna bir şey eklemek isterseniz

Bunun gibi:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
Bu cevabın mevcut sorunu
çözmede OP'ye

9

@Lycono tarafından istendiği gibi yorumumu yanıt olarak taşıma

Bunu kök ayrıcalıklarıyla yapmanız gerekiyorsa, şu şekilde yapın:

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

6
Yalnızca bir dize yazdırmak için bir kök kabuk çalıştırmaktan kaçınmak isteyebilirsiniz. echo "some data for the file" | sudo tee -a fileName >/dev/nullYalnızca teeroot olarak çalıştırmayı deneyin .
tripleee

6

Burada belgelerin kullanılamadığı ( Makefile, Dockerfilevb.) Ortamlar printfiçin genellikle makul bir şekilde okunabilir ve verimli bir çözüm için kullanabilirsiniz.

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
Yukarıdaki yorumunuz "dosya için bazı veriler" yankısını deneyin | sudo tee -a dosyaAdı> / dev / null yalnızca tee'yi kök olarak çalıştırmak için. gerçekten faydalı oldu!
Kojo

5

Birkaç mükemmel cevap olduğunu düşündüm, ancak tüm olasılıkların kısa bir özeti yoktu; Böylece:

Buradaki çoğu cevabın ardındaki temel prensip yeniden yönlendirme . İkisi dosyalara yazmak için önemli yönlendirme operatörleridir:

Yönlendirme Çıkışı:

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

Yeniden Yönlendirilmiş Çıktı Ekleme

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

İşte Belgeler

Diğerleri, sabit bir giriş kaynağından ziyade echo 'text' , yukarıdaki bash kılavuzunun bağlantısında da ayrıntılı olarak açıklanan "Here Document" ile etkileşimli olarak dosyalara yazabilirsiniz. Bu cevaplar, ör.

cat > FILE.txt <<EOF veya cat >> FILE.txt <<EOF

aynı yönlendirme işleçlerinden yararlanın, ancak "Here Documents" ile başka bir katman ekleyin. Yukarıdaki sözdiziminde, FILE.txt dosyasına çıktısını yazarakcat . Yazma yalnızca etkileşimli girdiye belirli bir dize verildikten sonra gerçekleşir, bu durumda 'EOF', ancak bu herhangi bir dize olabilir, örneğin:

cat > FILE.txt <<'StopEverything' veya cat >> FILE.txt <<'StopEverything'

aynen işe yarar. Burada Belgeler ayrıca çeşitli sınırlayıcıları ve diğer ilginç ayrıştırma karakterlerini arar, bu nedenle daha fazla bilgi için dokümanlara bakın.

İşte Dizeler

Biraz kıvrık ve hem yeniden yönlendirme hem de Here Documents sözdizimini anlamaya yönelik bir alıştırma, ancak Here Dokümanı sözdizimini standart yönlendirme işleçleriyle birleştirerek Here String'i oluşturabilirsiniz:

Cat Girişinin Yeniden Yönlendirilmesi

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

Cat Girişinin Yeniden Yönlendirilmiş Çıkışını Ekleme

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


0

Burada belge ve vi da kullanabilir, aşağıdaki komut dosyası 3 satır ve değişken enterpolasyon ile bir FILE.txt oluşturur

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

Sonra dosya aşağıdaki gibi 3 satır olacaktır. "i" vi ekleme modunu başlatmak ve benzer şekilde dosyayı Esc ve ZZ ile kapatmaktır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.