Echo komutunu ve yeniden yönlendirme işlecini kullanarak bir newline özel karakterini bir dosyaya nasıl koyabilirim?


29

Echo komutunu ve yönlendirme işlecini kullanarak bir dosya oluşturmak istiyorum, dosya birkaç satırdan oluşmalıdır.

Dize "\ n" ile yeni bir satır eklemeyi denedim:

echo "first line\nsecond line\nthirdline\n" > foo

ancak bu yolla, üç satırlı bir dosya oluşturulmaz, yalnızca bir satır ve dizenin sözlü içeriği olan bir dosya oluşturulur.

Sadece bu komutu birkaç satırlı bir dosya kullanarak nasıl oluşturabilirim?


Yanıtlar:


30

Komutla bazı sözdizimi kullanmak istediniz echo:

echo $'first line\nsecond line\nthirdline' > foo

(Ama aynı zamanda aldığın diğer cevabı da düşün.)

$'...'Yapı genişler ANSI çıkış sırasını gömülü.


1
Bunun POSIX olmadığını unutmayın, mevcut olup olmadığının büyük ölçüde hangi kabuğu kullandığınıza bağlı olduğunu unutmayın.
Chris Down

1
Bu yapıyı kabukları (en azından), ksh, bash, zsh (ve belki başkaları) içinde bulabilirsiniz.
Janis

1
@ChrisDown, henüz POSIX değil, ancak 8. sayıya dahil edilmesi planlanıyor. Ksh93, bash, zsh, mksh, FreeBSD sh bunu destekliyor.
Stéphane Chazelas

24

Yankı karakter kaçar ile yaptığı uygulama tanımlanır. Birçok eko uygulamasında (çoğu modern olanlar dahil), geçen dizi varsayılan olarak kaçışlar için incelenmez.

GNU bash (dahili olarak) tarafından sağlanan yankı ve diğer bazı yankı varyantları ile aşağıdaki gibi bir şey yapabilirsiniz:

echo -en 'first line\nsecond line\nthird line\n' > file

Ancak, gerçekten istediğiniz gibi geliyor printf, bu benim gözlerim için daha okunaklı ve daha da taşınabilir (POSIX tarafından tanımlanan bu özelliğe sahiptir):

printf '%s\n' 'first line' 'second line' 'third line' > file

Burada bir belge kullanmayı da düşünebilirsiniz :

cat > file << 'EOF'
first line
second line
third line
EOF

Kedinizi> dosya << 'EOF' yu kabuğumda denedim, bir kere girdiğimde, her satırda bu> şekilli istemi aldım, ancak ctrl + x veya ctrl + z
Abdul Al Hazred

Tek giriş satırında EOF
yazmanız yeterlidir

2
@mikeserv Meraklı mı yoksa ciddi mi oluyorsun?
Matthew

1
@AbdulAlHazred cevabındaki bağlantının belirttiği gibi, buna "burada belge" denir ve çok yaygındır. Wikipedia bu konuda iyi: en.wikipedia.org/wiki/Here_document .
dave_thompson_085

1
Bu benim Mac OSX'imde çalıştı (özellikle echo -en 'text..', kabul edilen cevap benim newline karakterimi ( \n) echo -entanımadığı halde.
benjaminmgross

4

echoKomutu kullanarak çok satırlı bir dosya oluşturmanın başka yolları da :

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

burada ikinci ve üçüncü komutlar >>, komut çıktısının dosyaya eklenmesine (eklenmesine) neden olan (bu noktada zaten olması gereken) yönlendirme işlecini kullanır .

Veya

(echo "first line"; echo "second line"; echo "third line") > foo

parantez echokomutları komutları tek bir alt işlem olarak gruplandırır; bu, çoklu satırlar çıkaran herhangi bir tek program gibi görünür ve hareket eder (örneğin ls, gibi ).

Yukarıdakilerin üzerinde ince bir varyasyon

{ echo "first line"; echo "second line"; echo "third line";} > foo

Bu, bir alt süreç oluşturmadığı için ikinci cevaptan biraz daha verimlidir. Ancak, sözdizimi biraz daha zor: nottan {önce ve sonra noktalı virgülten önce boşluk bırakmanız gerektiğini unutmayın }.

Bkz . Kabuğun kontrol ve yönlendirme operatörleri nelerdir? daha fazla bilgi için.


2

Başka bir seçenek daha vermek için, sadece Enter (örneğin yeni bir satırsonu) basabilirsiniz :

$ echo "the rain in spain
> falls mainly on the plain" > foo

Yazdığınız unutmayın >ikinci satırın başında. Bu $PS2, tamamlanmamış bir komut yazdığınızda kabuğun yazdırdığı ikincil kabuk istemidir (örneğin, bu durumda, benzersiz bir alıntı karakterine sahip bir komut).


0

POSIX 7 yapamayacağınızı söylüyor

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e tanımlanmamış ve ters eğik çizgiler uygulama tanımlanmış:

İlk işlenen -n ise veya işlenenlerden herhangi biri bir <backslash> karakteri içeriyorsa, sonuçlar uygulama tarafından tanımlanır.

isteğe bağlı bir XSI uzantısına sahip değilseniz.

Yani printfyerine:

biçim işleneni, XBD Dosya Biçimi Notasyonu'nda açıklanan biçim dizesi olarak kullanılmalıdır [...]

Dosya Formatı Gösterim :

\ n <newline> Baskı konumunu bir sonraki satırın başına götür.

Ayrıca Ubuntu 15.10 ve çoğu dağıtımın echoher ikisini de uyguladığını unutmayın.

  • bir Bash yerleşik: help echo
  • bağımsız bir çalıştırılabilir: which echo

bazı karışıklıklara yol açabilir.


Sistemde echomevcut olan her kabukta bir yerleşik olacaktır . Ubuntu'da / bin / sh genellikle tire, bash da varsayılan olarak gelir. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... hepsinin farklı davranışlarla kendi yankıları olur. Not which echosize sistemin yolunu vermeyecektir tüm kabuklarda yankı.
Stéphane Chazelas,

@ StéphaneChazelas "hangi yankı, tüm kabuklarda sistem yankısının yolunu vermeyecektir." Bilmiyordum, başka ne verebilirdi ki?
Ciro Santilli,

Tcsh veya zsh ile deneyin. whichbaşlangıçta (80'lerde) yalnızca csh kullanıcıları için bir csh betiği (takma adı ~ / .cshrc'den yükledi) ve hala bazı sistemlerde. whichzsh ve tcsh 'de yerleşiktir.
Stéphane Chazelas,
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.