Burada bir belgeyi Bash betiğindeki bir dosyaya nasıl yazabilirim?
Burada bir belgeyi Bash betiğindeki bir dosyaya nasıl yazabilirim?
Yanıtlar:
Gelişmiş Bash-Komut Dosyası Kılavuzu Bölüm 19. Burada Belgeler .
İçeriği bir dosyaya yazacak bir örnek /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Son 'EOF' (The LimitString
) kelimesinin önünde boşluk olmamalıdır, çünkü bu LimitString
tanınmayacaktır.
Bir kabuk komut dosyasında, kodu okunabilir hale getirmek için girintiyi kullanmak isteyebilirsiniz, ancak bu, burada belgenizdeki metne girinti eklemek için istenmeyen bir etkiye sahip olabilir. Bu durumda, kullanım <<-
(tire tarafından takip) (sekmeyi lider devre dışı bırakmak için Not size gerekecek Bunu test etmek olduğunu bir sekme karakteri ile lider boşluk yerine burada gerçek sekme karakterleri yazdırmak olamaz çünkü.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Metindeki değişkenleri yorumlamak istemiyorsanız, tek tırnak kullanın:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Yorumlu yazıyı bir komut satırından geçirmek için:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Çıktı:
foo
bbr
bbz
... ya da yorumlu yazıyı aşağıdakileri kullanarak bir dosyaya yazmak için sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, ne denir?
<<<
'Burada Dizeler' olarak adlandırılır. Like kodu tr a-z A-Z <<< 'one two three'
dizeyle sonuçlanır ONE TWO THREE
. En fazla bilgi en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
yerine <<EOF
.
Kullanmak cat
ve G / Ç yönlendirmesi tee
yerine, bunun yerine kullanmak yararlı olabilir :
tee newfile <<EOF
line 1
line 2
line 3
EOF
Daha özlüdür, ayrıca yönlendirme operatörünün aksine, sudo
root izinlerine sahip dosyalara yazmanız gerekirse birleştirilebilir .
> /dev/null
dosyanın içeriğini oluşturulduğunda stdout için görüntülenmesini önlemek için ilk satırın sonuna eklemeyi öneririm .
sudo
, kısalığı yüzünden değil , onunla uyumluluğu nedeniyle bana hitap etti :-)
man tee
. -a
Üzerine yazmak yerine eklemek için bayrağı kullanın .
Not:
Soru (burada bir belgenin (aka heredoc ) bash komut dosyasındaki bir dosyaya nasıl yazılır? ) Sorusunun (en az) 3 ana bağımsız boyutu veya alt sorusu vardır:
root
) Dosyanın sahibi mi?(Önemli olduğunu düşünmediğim diğer boyutlar / alt sorgular da var. Bunları eklemek için bu cevabı düzenlemeyi düşünün!) Burada, yukarıda listelenen sorunun boyutlarının çeşitli farklı sınırlayıcı tanımlayıcılarla daha önemli kombinasyonlarından bazıları var - hiçbir şey yok kutsal EOF
, sınırlayıcı tanımlayıcı olarak kullandığınız dizenin yorumlu metin içinde olmadığından emin olun :
Heredoc içindeki değişken referansları değiştirerek, sahip olduğunuz mevcut bir dosyanın üzerine yazmak (veya yeni bir dosyaya yazmak) için:
cat << EOF > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
Heredoc içindeki değişken referansları değiştirerek, sahip olduğunuz mevcut bir dosyayı eklemek (veya yeni bir dosyaya yazmak) için:
cat << FOE >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
Heredoc'un gerçek içeriği ile mevcut bir dosyanın üzerine yazmak (veya yeni bir dosyaya yazmak) için:
cat << 'END_OF_FILE' > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
Heredoc'un gerçek içeriğiyle varolan bir dosyayı eklemek (veya yeni bir dosyaya yazmak) için:
cat << 'eof' >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
Yorumlu metin içinde değişken referansların yerini alarak, root'a ait mevcut bir dosyanın üzerine yazmak (veya yeni bir dosyaya yazmak) için:
cat << until_it_ends | sudo tee /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
Kullanıcı = foo'ya ait varolan bir dosyayı heredoc'un gerçek içeriği ile eklemek (veya yeni bir dosyaya yazmak) için:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== --append
; yani, tee -a
-> tee
. Bkz. info tee
(Burada alıntı yaparım, ancak yorum işaretlemesi çok sınırlıdır.)
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
yerine EOF
?
@ Livven'ın cevabı üzerine inşa etmek için bazı yararlı kombinasyonlar.
değişken ikame, önde gelen sekme korunur, dosyanın üzerine yazılır, stdout'a yankı
tee /path/to/file <<EOF
${variable}
EOF
değişken değiştirme yok , önde gelen sekme korunuyor, dosyanın üzerine yaz, stdout'a yankı
tee /path/to/file <<'EOF'
${variable}
EOF
değişken değiştirme, önde gelen sekme kaldırıldı , dosyanın üzerine yaz, stdout'a yankı
tee /path/to/file <<-EOF
${variable}
EOF
değişken ikame, önde gelen sekme korunur, dosyaya ekle, stdout'a yankı
tee -a /path/to/file <<EOF
${variable}
EOF
değişken ikame, önde gelen sekme korunmuş, dosyanın üzerine yaz, stdout'a yankı yok
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
yukarıdakiler de kombine sudo
edilebilir
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Hedef dosya için kök izinleri gerektiğinde, aşağıdakiler |sudo tee
yerine şunu kullanın >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Bu sorunu yaşayabilecek gelecekteki insanlar için aşağıdaki format işe yaradı:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
cat << END > afile
ardından yorumlu metin mükemmel çalışıyor.
cat
, kabul edilen yanıtta gösterildiği gibi başlayan satırın sonunda olması gerekir .
cat
bir alt kabuğun içinde çalışır ve alt kabuğun tüm çıktıları dosyaya yönlendirilir
Örnek olarak kullanabilirsiniz:
İlk olarak (ssh bağlantısı yapmak):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
İkincisi (komutları yürütmek):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Üçüncü olarak (komutları yürütmek):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
Dördüncü (değişkenleri kullanarak):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE