Come diff un file e l'output dal comando?


32

Normalmente dovresti scrivere:

diff file1 file2

Ma vorrei diff un file e l'output dal comando (qui faccio un comando banale):

diff file1 <(cat file2 | sort)

Ok, questo lavoro quando lo inserisco manualmente al prompt della shell, ma quando inserisco esattamente la stessa riga nello script della shell e quindi eseguo lo script, ottengo un errore.

Quindi, la domanda è: come farlo correttamente?

Ovviamente vorrei evitare di scrivere l'output in un file temporaneo.

Risposte:


39

Sospetto che la tua sceneggiatura e la tua shell siano diverse. Forse hai #!/bin/shla parte superiore della tua sceneggiatura come interprete ma stai usando bashcome shell personale. È possibile scoprire quale shell si esegue in un terminale eseguendo echo $SHELL.

Un modo più semplice per farlo, che dovrebbe funzionare sulla maggior parte delle shell, sarebbe usare un reindirizzamento della pipe invece dell'operatore di lettura dei file fornito. Il simbolo '-' è una nomenclatura standard per la lettura di STDIN e può spesso essere usato come sostituto di un nome di file in un elenco di argomenti:

cat file2 | sort | diff file1 -

O per evitare un uso inutile del gatto :

sort < file2 | diff file1 -

Ah, sei bravo, davvero, non ho controllato se sh è bash o no. Grazie mille per la soluzione.
Greenoldman,

Si tratta di un file diverso con stdout. Ora come diff stdout con un file? Voglio dire, la direzione opposta. è -Rin caso di utilizzogit diff --no-index
Nakilon

@Nakilon Si potrebbe solo cambiare l'ordine degli argomenti: diff - file1.
Caleb,

Freddo. Questo non ha funzionato per git diff.
Nakilon,

@Nakilon Certo che no, perché dovrebbe? git diffè una bestia completamente diversa e opera su riferimenti a oggetti glob nel suo indice interno, non su file; diffopera sul file system. La -sintassi è solo zucchero sintattico di shell per /dev/stdin, il file che rappresenta il flusso STDIN. Quindi perché diffpuò usarlo come sostituto di un nome di file. Nel frattempo git diffnon è alla ricerca di file, sta cercando oggetti, quindi devi passarli qualcosa che riconosce. Non usarlo per confrontare i file tra loro, usalo diffper quello.
Caleb,

-4

Lo scopo dell'input standard è lo script stesso, quindi inserisci il tuo codice in un blocco come questo:

{
  diff file1 <(sort file2)
}

In questo modo l'ambito di STDIN è all'interno del blocco ..

Ho provato e funziona.


Questa non è una funzione, è un blocco e non fa alcuna differenza.
Gilles 'SO- smetti di essere malvagio' il

@gilles Thx per la correzione. A proposito, ho provato me stesso e funziona. Hai fatto?
dal

3
Il blocco non ha alcun effetto sulla validità del <(…)costrutto. Lo script funzionerà o meno a seconda che lo si esegua in una shell che supporti <(…)o meno (ksh93 / bash / zsh vs Bourne / ash / kshk88). La risposta di Caleb inchioda tutto.
Gilles 'SO- smetti di essere malvagio' il

1
@gilles ok, grazie per la spiegazione.
dal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.