Bir dosyanın içeriğini “echo” komutuna yönlendirmek


41

Adlı bir dosya var my_file.txt, içeriği sadece dizedir Hello. İçeriğini komuta nasıl yönlendirebilirim echo?

Ben komutları var biliyorum less, cat, more... ama bunu yapmak gerekir echo.

Bunu denedim:

$ cat my_file.txt | echo

ve ayrıca bu:

$ echo < my_file.txt

Ancak her iki durumda da my_file.txt dosyasının içeriğini değil, yalnızca stdout'ta boş görünüyor.

Bunu nasıl yapabilirim?


7
Neden kullanmakta ısrar ediyorsun echo?
Kevin

7
@Kevin, muhtemelen sonunda dosyadaki ANSI C kaçış dizilerini ( \n, b...) genişletmek istiyor , ki bunun geçerli bir kullanımı olacaktır echo(en azından standart echo). Ya da muhtemelen neden bu şekilde çalışmadığını anlamak istiyor. Her durumda, IMO'yu düşürmek için hiçbir sebep yok.
Stéphane Chazelas

3
Buraya geldim çünkü echo <file.txt yaparken neden çalışmadığını merak ediyordum. SE de makul bir soru gibi görünüyor, cevap çok yardımcı oldu. Benden +1.
neuronet

Yanıtlar:


53

İstediğin her şeyi yönlendirebilirsin echoama onunla hiçbir şey yapmaz. echostandart girişini okumuyor. Tek yaptığı standart çıktıya boşluk karakteriyle ayrılmış ve yeni satır karakteriyle sonlandırılmış argümanlarını yazmaktır (ve içlerinde echobazı kaçış dizileri bulunan bazı uygulamalar ve / veya -olasılıkla seçenek olarak başlayan argümanlar ile ).

İsterseniz echobir dosyanın içeriğini görüntülemek için, size bir argüman olarak bu içeriği geçmek zorunda echo. Gibi bir şey:

echo "$(cat my_file.txt)"

Not $(...)arka satır karakteri şeritler s bu çıkışından catkomut ve echoekler , bir arka.

Ayrıca, haricinde zsh, NUL karakterlerini bir komutun argümanlarında geçiremeyeceğinize dikkat edin , böylece yukarıdaki genellikle ikili dosyalarla çalışmaz. yashgeçerli karakterlerin bir parçasını oluşturmayan baytları da kaldıracaktır.

İstediğiniz çünkü bunu yapmak isteyen nedeni ise echogenişletmek için \n, \b, \0351(UNIX conformant olarak ... dosyasındaki kaçış dizileri echouygulamaları yapmak ama hepsi değil ), sonra sen yerine kullanmayı tercih printfyerine :

printf '%b\n' "$(cat my_file.txt)"

Aksine echo, bu dosya taşınabilir ve dosyanın içeriği ile başlarsa sorun yaşamayacaksınız -.


Bir alternatif olarak $(cat file), birlikte ksh, zshve bashbir de yapabilirsiniz:$(<file) . Bu , genişletmeyi yapmak için dosyanın içeriğini okumak yerine kabuğun bulunduğu özel bir catişleçtir. Hala sondaki yeni satırları çıkarır ve dışında NUL baytlarında boğulur zsh. Içinde bash, bu hala fazladan bir işlem çatal. Ayrıca, farkın bir türünün bu şekilde bir tür dizin dosyasını okumaya çalışırken herhangi bir hata almayacağınız olduğunu unutmayın. Ayrıca, $(< file)özel olmakla birlikte , $(< file; other command)(içinde zsh, başka bir kabuğu taklit etmediğinde, içeriğini genişleten bu file, kapalı $READNULLCMD komutu çalıştırarak (tipik olarak bir çağrı cihazı) değildir.


3
Her iki bash ve ZSH sen atlayabilirsiniz catve sadece kabuk doğrudan okudum vardır: echo "$(<my_file.txt)".
Kevin

1
Evet, ksh , zsh ve bash ile kullanabilirsiniz $(<filename).
Dimitre Radoulov

Çok teşekkür ederim, ihtiyacım olan şey buydu ve işe yaradı! :-)
danielmbcn

@Kevin, Dimitre, şimdi ekledi.
Stéphane Chazelas

4

Diğer cevaplara ekleyerek giriş yerine yönlendirmeyi de deneyebilirsiniz. cat

echo $(<my_file.txt)

veya

echo `<my_file.txt`

$()ve `` aynı şeyi yaparlar, kendi kapsamları içinde komutlar çalıştırır ve çıktıyı kullanıcı tarafından bir girdi olarak verilmiş gibi kabuğa verir. Bu ikisi arasındaki tek fark $ () 'in özyinelemeli olabileceği ve `` özyinelemeli olamayacağıdır.


2

Basit cevap: yapamazsın. echo(Kabuk yerleşik veya normal ikili olabilir) standart girişini işlemez - sadece bir yoldur.


Soru, neden bunu gerçekten yapmak istiyorsun?
peterph

2

Söylendiği gibi

İsterseniz echobir dosyanın içeriğini görüntülemek için, size bir argüman olarak bu içeriği geçmek zorundaecho

Örneğin, bu şekilde yapabilirsiniz xargs( ters eğik çizgi çıkışlarının yorumlanmasını etkinleştirmeniz gerektiğine dikkat ederek ):

$ cat my_file.txt | xargs echo -e

Ya da sadece sorduğun şeyi ( kaçan dizilerin yorumunu yapmadan ):

$ cat my_file.txt | xargs echo

Ancak, kullanıldığında xargs echo( xargsbtw'nin echovarsayılan komutla aynı olduğu gibi ), echokabuğun yerleşik echokomutunu değil, çalıştırılacak olan dosya sistemindeki komut olduğunu unutmayın. Ayrıca xargs, girişin çok özel bir formatta olmasını beklediğine dikkat edin (boşluklar, yeni satırlar, tırnaklar, ters eğik çizgiler özel bir anlam taşır). cataynı BİRLEŞTİR sadece bir dosya (orada burada çok mantıklı değil < file.txt xargs echo. Unix uyumlu olduğunu Not echoler varsayılan ve çıkış tarafından ters eğik çizgi kaçış genişleme yapmak -eüzerine echo -e.
Stéphane Chazelas

0

Bash olarak, aşağıdakiler de çalışmalıdır:

echo `cat my_file.txt`

Geri tepmelerdeki kısım, bu komutun çıktısıyla değiştirilir, yani bu durumda dosya içeriği ile değiştirilir.


Doğru, backticks gibi çalışır $( . . . ). $()Bunu kullanan insanlar genellikle onları tercih eder çünkü onları yuvalayabilirsiniz. Bu soru eski, ancak henüz cevaplanmamış soruları cevaplamak için çok daha tatmin edici!
Yasa29,

Tam değil. İnce bir fark var. Geri tıklatma formu kullanıldığında, ters eğik çizgi, $, `veya \ ile gösterilenler dışında, gerçek anlamını korur. Ters eğik çizgiden önce gelmeyen ilk arka tik komutu komutu sonlandırır. $ (,,,) formunu kullanırken, parantez içindeki tüm karakterler komutu oluşturur.
fpmurphy

Bu komut ikame edilmediğinden, split + glob operatörü buna uygulanacaktır. Örneğin my_file.txtiçerdiği *, bu geçerli dizinde dosya adlarının listesini yazdırmak istiyorum.
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.