Bu iki komutun çıktısını birleştirmek mümkün mü?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Her iki komut da çıkmaz, bu yüzden bunun nasıl yapılacağından emin değilim.
Bu iki komutun çıktısını birleştirmek mümkün mü?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Her iki komut da çıkmaz, bu yüzden bunun nasıl yapılacağından emin değilim.
Yanıtlar:
İki komutu bir grupla birleştirerek birleştirebilirsiniz { }
:
{ command1 & command2; }
şu ana kadar grubu bir dosyaya yönlendirebilirsiniz (daha ;
önce }
zorunludur):
{ command1 & command2; } > new_file
Eğer ayırmak istiyorum STDOUT
ve STDERR
iki dosyalarında:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
önce }
, zorunlu değil!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
Çizgiler kırılmazsa, ideal olarak hiçbir şeyi yazdırmayacak olanları deneyebilirsiniz .
&&
tercih ederim &
! command1 & command2
- bu, komut1'i arka planda çalıştırır ve hemen komut2'yi başlatır, böylece her iki komutu da paralel olarak çalıştırır ve çıktıyı karıştırır. command1 && command2
- bu, komut1'i (ön planda) çalıştırır ve ardından komut1 başarılı olursa, komut2'yi çalıştırır.
Daha genel olarak, bir alt kabuk veya komut grubu kullanmak ve tüm grubun çıktısını bir kerede yönlendirmek mümkündür.
Kod:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
İkisi arasındaki temel fark, birincisinin bir çocuk sürecine bölünmesi, ikincisinin ise ana kabuk bağlamında çalışmasıdır. Bunun, değişkenlerin ve diğer ortam ayarlarının yanı sıra performansın ayarlanması ve kullanılmasıyla ilgili sonuçları olabilir.
Unutmayın, komut grubundaki (ve fonksiyonlardaki) kapanış dirsekleri içeriklerden noktalı virgül ya da yeni satır ile ayrılmalıdır. Bunun nedeni "}"
aslında kendi başına bir komut (anahtar kelime) olması ve bunun gibi davranılması gerektiğidir.
( )
gayet iyi.
}
hiç bir komut değil. Ayrılmış bir kelime. Aynı şey için de geçerli {
. Genellikle şöyle böyle listeler yazmak: { command1;command2;} > outfile.txt
. Noktalı virgüllerden sonra boşluk ekleyebilirsiniz, ancak bu gerekli değildir. Uzay sonra {
ise de, gerekli.
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
Çizgiler kırılmazsa, ideal olarak hiçbir şeyi yazdırmayacak olanları deneyebilirsiniz . (H / t @antak).
( command1 && command2 && command3 ) | cat
()
, {}
arkaplan ilerlemesi olarak çalıştıran kıvrımlı parantezlerde olduğu gibi tercih ediyorum ve ondan çıktılarla başa çıkmak zorundasınız. Ayrıca kedi `pipo | kedi daha güzel bir alternatiftir, sonra>> / dev / stdout`
Bunu yapmayı bitirdim, diğer öneriler işe yaramadı, çünkü 2. emir ya öldürüldü ya da hiç uygulanmadı.
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
tail -f *.log
aynı günlük dosyasına yazan 2 farklı işlemle ilgili bir sorun olarak görmemiş olmama rağmen yapabilirim .
yes {1..20}
command2 = ile deneyebilir yes {1..20}
ve birleştirilen çıktıyı, | grep -v '^1 2 3'
çizgiler kırılmadığında ideal olarak hiçbir şey yazdırmayacak şekilde yönlendirebilirsiniz. (H / t @antak).
Bunu dene:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
Şimdiye kadar çözümlerin çoğu kısmi çizgi problemi ile çok kötü bir şekilde ilgileniyor. Programların bir saniye olduğunu varsayalım:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
Bunları paralel olarak çalıştırırken çıktının tam a
s satırının ardından tam s satırının olmasını istersiniz b
. Ne yapmak değil istemek olduğunu a
lar ve b
aynı satırda karıştırma lar ( tr -s ab
tekrarlayan yerini a
ler tek olan a
, yüzden ne olacağını görmek daha kolaydır):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Bunun yerine GNU Parallel kullanıyorsanız, a
s veya b
s tuşlarıyla temiz ama tam çizgiler elde edersiniz, ancak asla karıştırmazsınız:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
GNU Parallel'un yeni sürümleri bile diskinizi doldurmaktan kaçınır: Yukarıdakiler sonsuza dek çalışabilir.
Birden fazla BASH komut çıkışını bir satıra birleştirmek için özel durum için, her bir komutu sırayla çalıştırmak ve çıkışları arasındaki tüm yeni satırları kaldırmak için bir reçete.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
Gerçek dünyadan bir örnek olarak, aşağıdaki kod iki sabit bayt dizisi arasına bir ASCII mesajı yerleştirecektir (bu durumda bir baskı komutu oluşturarak)
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(Not: bu yöntem yalnızca komutlar çıktığında çalışır. Çıkmaz komutlarından stdout komutunu birleştirmek için diğer yanıtlara bakın.)