Come differisco l'output di due comandi?

131

Avevo immaginato che il modo più semplice per confrontare il contenuto di due directory simili sarebbe qualcosa di simile a

diff 'ls old' 'ls new'

Ma capisco perché questo non funziona; diff riceve una lunga lista di file sulla riga di comando, invece di due flussi come speravo. Come faccio a passare direttamente le due uscite a diff?

    
posta Ternary 15.12.2012 - 23:01

3 risposte

193

La sostituzione di comando '…' sostituisce l'output del comando nella riga di comando, quindi diff vede l'elenco di file in entrambe le directory come argomenti. Quello che vuoi è che diff visualizzi due nomi di file sulla sua riga di comando e che i contenuti di questi file siano gli elenchi di directory. Questo è ciò che sostituzione del processo fa.

diff <(ls old) <(ls new)

Gli argomenti a diff assomigliano a /dev/fd/3 e /dev/fd/4 : sono descrittori di file corrispondenti a due pipe create da bash. Quando diff apre questi file, verrà connesso al lato di lettura di ogni pipe. Il lato di scrittura di ogni pipe è collegato al comando ls .

    
risposta data Gilles 15.12.2012 - 23:06
2

Fish shell

In Fish Shell devi inserire psub . Ecco un esempio di confronto tra heroku e dokku config con Oltre il confronto :

bcompare (ssh [email protected] dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)
    
risposta data WooYek 12.04.2018 - 09:34
1

Per zsh, utilizzando =(command) crea automaticamente un file temporaneo e sostituisce =(command) con il percorso del file stesso. Con la sostituzione dei comandi, $(command) viene sostituito con output del comando.

Quindi ci sono tre opzioni:

  1. Sostituzione del comando: $(...)
  2. Sostituzione del processo: <(...)
  3. Sostituzione processo aromatizzata con zsh: =(...)

La subsitution di processo con gusto zsh, # 3, è molto utile e può essere usata in questo modo per confrontare l'output di due comandi usando uno strumento diff, ad esempio Beyond Compare:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

Per Oltre il confronto, tieni presente che devi utilizzare bcomp per quanto sopra (anziché bcompare ) poiché bcomp avvia il confronto e aspetta per il completamento. Se utilizzi bcompare , questo avvia il confronto e termina immediatamente a causa della quale scompaiono i file temporanei creati per memorizzare l'output dei comandi.

Leggi di più qui: link

Nota anche questo:

  

Si noti che la shell crea un file temporaneo e lo elimina al termine del comando.

e il seguente che è la differenza tra i due tipi di sostituzione del processo supportati da zsh (i.e # 2 e # 3):

  

Se leggi la pagina man di zsh, potresti notare che & lt; (...) è un'altra forma di sostituzione del processo che è simile a = (...). C'è una differenza importante tra i due. Nel caso & lt; (...), la shell crea una named pipe (FIFO) invece di un file. Questo è meglio, dal momento che non riempie il file system; ma non funziona in tutti i casi. In effetti, se avessimo sostituito = (...) con & lt; (...) negli esempi sopra, tutti avrebbero smesso di funzionare tranne fgrep -f & lt; (...). Non è possibile modificare una pipe o aprirla come cartella della posta; fgrep, tuttavia, non ha alcun problema con la lettura di un elenco di parole da una pipe. Ci si potrebbe chiedere perché diff & lt; (foo) bar non funzioni, dato che foo | lavori diff - bar; questo perché diff crea un file temporaneo se nota che uno dei suoi argomenti è -, e quindi copia il suo input standard nel file temporaneo.

Riferimento: link

    
risposta data Ashutosh Jindal 29.06.2018 - 10:59

Leggi altre domande sui tag