¿Cómo difiero la salida de dos comandos?

132

Me imaginaba que la forma más sencilla de comparar los contenidos de dos directorios similares sería algo así como

diff 'ls old' 'ls new'

Pero veo por qué esto no funciona; diff recibe una gran lista larga de archivos en la línea de comandos, en lugar de dos secuencias como esperaba. ¿Cómo paso las dos salidas a diff directamente?

    
pregunta Ternary 15.12.2012 - 23:01

3 respuestas

194

Sustitución de comando '…' sustituye la salida del comando en la línea de comando, por lo que diff ve la lista de archivos en ambos directorios como argumentos. Lo que desea es que diff vea dos nombres de archivo en su línea de comando y que los contenidos de estos archivos sean los listados del directorio. Eso es lo que hace sustitución de procesos .

diff <(ls old) <(ls new)

Los argumentos para diff se verán como /dev/fd/3 y /dev/fd/4 : son descriptores de archivos correspondientes a dos tuberías creadas por bash. Cuando diff abre estos archivos, se conectará al lado de lectura de cada tubería. El lado de escritura de cada tubería está conectado al comando ls .

    
respondido por el Gilles 15.12.2012 - 23:06
2

Concha de pescado

En Fish shell debes ingresar a psub . Aquí hay un ejemplo de la comparación de configuración de heroku y dokku con Más allá de la comparación :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)
    
respondido por el WooYek 12.04.2018 - 09:34
1

Para zsh, el uso de =(command) crea automáticamente un archivo temporal y reemplaza =(command) con la ruta del archivo en sí. Con Command Substitution, $(command) se reemplaza con output del comando.

Entonces hay tres opciones:

  1. Sustitución de comando: $(...)
  2. Sustitución del proceso: <(...)
  3. Sustitución del proceso con sabor a zsh: =(...)

La sustitución del proceso con sabor a zsh, n. ° 3, es muy útil y se puede usar para comparar el resultado de dos comandos utilizando una herramienta diff, por ejemplo Beyond Compare:

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

Para Beyond Compare, tenga en cuenta que debe usar bcomp para lo anterior (en lugar de bcompare ) ya que bcomp inicia la comparación y espera para que se complete. Si usa bcompare , inicia la comparación e inmediatamente sale debido a lo cual desaparecen los archivos temporales creados para almacenar la salida de los comandos.

Obtenga más información aquí: enlace

También ten en cuenta esto:

  

Tenga en cuenta que el shell crea un archivo temporal y lo elimina cuando el comando finaliza.

y lo siguiente que es la diferencia entre los dos tipos de sustitución de procesos soportados por zsh (es decir, # 2 y # 3):

  

Si lee la página man de zsh, puede observar que & lt; (...) es otra forma de sustitución de proceso que es similar a = (...). Hay una diferencia importante entre los dos. En el caso & lt; (...), el shell crea un conducto con nombre (FIFO) en lugar de un archivo. Esto es mejor, ya que no llena el sistema de archivos; pero no funciona en todos los casos. De hecho, si hubiéramos reemplazado = (...) con & lt; (...) en los ejemplos anteriores, todos habrían dejado de funcionar a excepción de fgrep -f & lt; (...). No puede editar un conducto o abrirlo como una carpeta de correo; fgrep, sin embargo, no tiene problema con leer una lista de palabras de un tubo. Puede preguntarse por qué diff & lt; (foo) bar no funciona, ya que foo | trabajos de diff - bar; esto se debe a que diff crea un archivo temporal si nota que uno de sus argumentos es -, y luego copia su entrada estándar al archivo temporal.

Referencia: enlace

    
respondido por el Ashutosh Jindal 29.06.2018 - 10:59

Lea otras preguntas en las etiquetas