Yanıtlar:
Çünkü çalışmıyor catPiponuzu sırayla programı okumak için talimat değildi echostandart girdiden programın çıktısını.
Sen kullanabilirsiniz -standart giriş belirtmek için bir sözde dosya adı olarak cat. Gönderen man catbir msys2 yüklemesinde:
EXAMPLES
cat f - g
Output f's contents, then standard input, then g's contents.
O zaman dene
echo "abc" | cat - 1.txt > 2.txt
yerine.
Başkaları tarafından belirtildiği gibi, orijinal komutunuz cat 1.txtstandart girdisini göz ardı ettiği için başarısız olur . Ya onun ilk argümanı ( cat - 1.txt) olması gerektiğini belirtin veya yönlendirmek ve birlikte yönlendirmek için blok yönlendirmeyi kullanın . Zekâ için:echo abc cat 1.txt
{ echo abc; cat 1.txt; } > 2.txt
Kılavuzdan ilgili alıntı ( man bash):
Bileşik Komutlar Bileşik
komut aşağıdakilerden biridir. Çoğu durumda , bir komutun açıklamasındaki bir liste , komutun geri kalanından bir veya daha fazla yeni satır ile ayrılabilir ve arkasından noktalı virgül yerine bir yeni satır gelebilir.
(liste)listesi bir alt kabuk ortamında yürütülür (aşağıdaki KOMUT YÜRÜTME ORTAMI'na bakın). Kabuğun ortamını etkileyen değişken atamaları ve yerleşik komutlar, komut tamamlandıktan sonra geçerli olmaz. Dönüş durumu listenin çıkış durumudur.
{liste;}liste sadece geçerli kabuk ortamında yürütülür. liste bir satırsonu veya noktalı virgülle sonlandırılmalıdır. Bu, grup komutu olarak bilinir . Dönüş durumu listenin çıkış durumudur . Meta karakterler aksine o Not
(ve),{ve}vardır ayrılmış sözcükler ve ayrılmış bir kelime tanınacak izin nerede gerçekleşmelidir. Sözcük kesintisine neden olmadıkları için , boşluk veya başka bir kabuk metakarakteriyle listeden ayrılmalıdır .
İlk seçenek (alt kabuk ortamı), çoğu sizin senaryonuzla ilgisi olmasa da bir sürü yan etkiye sahiptir; ancak, bir grup komutun çıktısını yeniden yönlendirmek için tek ihtiyacınız varsa, burada Seçenek # 2 (grup komutu) tercih edilir.
( echo "abc"; cat 1.txt ) > 2.txt
Yankı çıkışını kediye bağladınız, ancak kedinin giriş için bir faydası yoktu ve yok sayıldı. Şimdi komutlar birbiri ardına çalışır ve çıktıları gruplandırılır (parantez) ve 2.txt'ye yönlendirilir.
bash(1), her POSIX uyumlu kabuğun desteklemesi gereken davranışı açıklar .
Herhangi bir POSIX kabuğunda aşağıdakiler cat fileiçin girdi olarak kullanmak üzere komut ikamesini kullanabilirsiniz echo:
echo $(cat file1.txt) "This Too"
Bash'te işlem ikamesini ve echo'yu başka bir "dosya" catolarak aşağıdaki gibi kullanabilirsiniz:
cat file1.txt <(echo This Too)
ve sonra çıktıyı uygun gördüğünüz şekilde yönlendirin veya yönlendirin.
Diğer tüm cevapların söylediği gibi, kedi bakılacak bir dosya varsa stdin'i yok sayar. (Daniel & mvw'nin cevaplarını da beğendim, onlar için +1)
<(command)İnşaat bir bash uzantısıdır. POSIX değildir, bu nedenle yürütülmesi gereken komut dosyalarına güvenemezsiniz /bin/sh.
Sadece bir tahmin, ama bir takma ad veya işlev için iyi bir aday olan tekrarlanabilir bir süreciniz var gibi görünüyor. Takma adlar genellikle bağımsız değişken olarak tek bir giriş akışında kısaltma gibi bash komutlarını çağırmak için kullanılan kısa yollardır.
alias hg="history | grep"
Bununla birlikte, bu durumda, birden çok, ayrık (2) giriş akışının yanı sıra çoklu bash komutlarını birleştirdiğiniz için bir işlev daha okunabilir olacaktır. İlki bir dize, diğeri bir dosya yolu olmak üzere iki argümanınız var. Sonunda, sonucun stdout çıktı akışına yazılmasını istiyorsunuz.
CLI isteminden şunu yazın:
# ecat()
{
echo ${1}
cat ${2}
}
Fonksiyonunuza unutulmaz olan ecat adı verilir.
Şimdi şu şekilde çağırabilirsiniz:
ecat "abc" 1.txt
Eklemek için stdout'a farklı bir çıkış hedefi sağlamanız yeterlidir:
ecat "abc" 1.txt >> 2.txt
Ekle yönlendirme operatörü '>>' çıktıyı belirtilen dosyanın sonuna ekler.
Beğendiyseniz, tekrar kullanmak için ~ / .bashrc dosyanıza ekleyin.
declare -f ecat >> ~/.bashrc
Bu ayrıca işlev tanımınız içinde süsleyebileceğiniz vb. Anlamına gelir.
Ayrıca ~ / .bashrc dosyasına ekleyerek dosyaların üzerine yazılmasını önlemek için iyi bir fikir
set noclobber
"$1"ve "$2". Bu bağlamda, kıvırcık parantezlerin hiçbir faydası yoktur. Gördüğünü ${name}düşündüğün anlamına gelmez… .
noclobberÖneri eldeki soruya nasıl cevap veriyor? (Ayrıca, bunun iyi bir tavsiye olduğuna ikna oldum - küresel davranışı değiştirmek, varsayılanları göz önünde bulundurarak oluşturulan komut dosyalarını / tavsiyeleri / uygulamaları kırma eğilimindedir).
Aşağıdaki kod da çalışır:
echo abc >> 1.txt && cat 1.txt > 2.txt
Çıktısı yankı abc ile 1.TXT eklenecektir >> Bundan sonra && hangi irade komutları sonraki seti çalıştırmak için bunu söyleyecektir kedi 1.txt sonra çıktı o ve 2.txt . Temel olarak, ilk komutun çıktısını 1.txt'ye ekler ve sonra 1.txt çıktısını 2.txt'ye gönderir.
Önce abc'nin görünmesini istiyorsanız, aşağıdaki kodu kullanabilirsiniz:
echo abc >> 2.txt && cat 1.txt >> 2.txt
abcen alt bölgesinin 2.txt; soru üstte istiyor. (2) modifiye1.txt dosyası; bu kabul edilemez.
echoönce catnumune komuta, ben asla tam olarak, varsayalım açıkça , daha önce eko çıktı istediğini söylüyor girdi dosyasının içeriği. Görünüşe göre çoğu insan bunu böyle yorumluyor. (2) 1.txtbir girdi dosyasıdır. Soru, değişiklik hakkında hiçbir şey söylemiyor 1.txt. Giriş dosyalarının değiştirilmemesi gerektiği söylenmeden gider.
catyalnızca dosya adı bağımsız değişkenleri yoksa standart girdiden okur gibi .