Spune ca am prea programe " a " și " b " care pot rula cu ./un "și". /b
.
Este posibil să diff lor ieșiri fără prima scriere pentru fișiere temporare?
Folosi<(comandă) să treacă un command's de ieșire la un alt program cum ar fi un nume de fișier. Bash conducte programul's de ieșire la o conductă și trece un nume de fișier ca /dev/fd/63
la exterior de comandă.
diff <(./a) <(./b)
În mod similar, puteți utiliza `>(comanda) dacă vrei să conductei ceva în o comandă.
Acest lucru este numit "Proces de Substituție" în Bash's pagină.
O opțiune ar fi de a utiliza pipe cu nume (Fifo):
mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo
... dar John Kugelman's soluție este mult mai curat.
Pentru oricine este curios, acesta este modul de a efectua procesul de substituire în utilizarea Pește coajă:
Bash:
diff <(./a) <(./b)
Pește:
diff (./a | psub) (./b | psub)
Din păcate, punerea în aplicare în pești este în prezent deficitare; pește, fie va bloca sau de a folosi un fișier temporar pe disc. Ai, de asemenea, nu poate folosi psub pentru ieșirea din comanda ta.
Adăugarea de un pic mai mult la deja raspunsuri bune (m-a ajutat!):
Comanda docker
ieșiri de ajutorul ei pentru a STD_ERR
(de exemplu, fișierul descriptor 2)
Am vrut să văd dacă docker atașați " și " docker atașați --help
a dat acelasi randament
$ docker atașa
$ docker atașați --help
Având doar tastat cele două comenzi, am făcut următoarele:
$ dif <(!-2 2>&1) <(!! 2>&1)
!! este la fel ca !-1 ceea ce înseamnă rulați comanda 1 înainte de aceasta - ultima comanda
!-2 înseamnă rulați comanda două înainte de asta
2>&1 înseamnă trimite file_descriptor 2 de ieșire (STD_ERR) în același loc ca file_descriptor 1 ieșire (STD_OUT)
Sper că acest lucru a fost de folos.
Pentru zsh, folosind =(comanda)
creează automat un fișier temporar și înlocuiește =(de comandă) cu calea fișierului în sine. Cu Procesul normal de Substituție,
$(comandă) se înlocuiește cu ieșire de comanda.
Acest zsh caracteristică este foarte util și poate fi folosit atât pentru a compara ieșire de două comenzi, folosind o dif instrument, de exemplu, Dincolo de comparație:
bcomp =(ulimit -Sa | sort) =(ulimit -Ha | sort)
Pentru Beyond Compare, rețineți că trebuie să utilizați bcomp pentru cele de mai sus (în loc de
bcompare) din
bcomplansează comparație și **așteaptă** pentru a finaliza. Dacă utilizați
bcompare`, care lansează comparație și iese imediat din cauza care fișierele temporare create pentru a stoca producția de comenzi dispar.
Citeste mai mult aici: http://zsh.sourceforge.net/Intro/intro_7.html
Observa, de asemenea, acest lucru:
Rețineți că shell creează un fișier temporar, și șterge-l atunci când comanda este terminată.
și la urma care este diferenta intre $ ( ... ) "și" = ( ... )
:
Dacă ai citit zsh's pagină, puteți observa că <(...) este o altă formă de proces de substituție care este similar cu =(...). Există o diferență importantă între cele două. În <(...) caz, shell-ul creează un nume pipe (FIFO) în loc de un fișier. Acest lucru este mai bine, deoarece nu se umple sistemul de fișiere; dar aceasta nu funcționează în toate cazurile. În fapt, dacă am fi înlocuite =(...) cu <(...) în exemplele de mai sus, toate s-au oprit de lucru, cu excepția fgrep -f <(...). Nu puteți edita o țeavă, sau deschideți-l ca un e-mail folder; fgrep, cu toate acestea, nu are nici o problema cu citirea unei liste de cuvinte dintr-o țeavă. Poate vă întrebați de ce dif <(foo) bar nu't de lucru, deoarece foo | diff - bar de lucrări; acest lucru este din cauza dif creează un fișier temporar dacă se constată că unul dintre argumentele sale este -, și apoi copiile sale standard de intrare în fișierul temporar.