Había imaginado que la forma más sencilla de comparar el contenido de dos directorios similares sería algo así como
diff `ls old` `ls new`
Pero veo por qué esto no funciona; diff
se le está entregando una larga lista de archivos en la línea de comando, en lugar de dos secuencias como esperaba. ¿Cómo paso las dos salidas a diff directamente?
command-line
diff
Ternario
fuente
fuente
Respuestas:
La sustitución de comandos sustituye
`…`
la salida del comando en la línea de comandos, por lo quediff
ve la lista de archivos en ambos directorios como argumentos. Lo que desea esdiff
ver dos nombres de archivo en su línea de comando y que el contenido de estos archivos sea el listado de directorios. Eso es lo que hace la sustitución del proceso .Los argumentos a
diff
se verán/dev/fd/3
y/dev/fd/4
: son descriptores de archivo correspondientes a dos tuberías creadas por bash. Cuandodiff
abra estos archivos, se conectará al lado de lectura de cada canalización. El lado de escritura de cada tubería está conectado alls
comando.fuente
echo <(echo) <(echo)
Nunca pensé que esto podría ser tan interesante: Dls
es que altera los nombres de los archivos. Analizar su salida es frágil (no funciona con nombres de archivo "extraños"). Para comparar dos listados de directorio, está bien siempre que la salida no sea ambigua. Con nombres de archivo arbitrarios, esto requeriría una opción como--quoting-style=escape
.<(…)
crea una tubería. Parece que la fusión no funciona con tuberías, por lo que no puede usarla<(…)
. En zsh, puede reemplazar<(…)
por=(…)
y funcionará porque=(…)
coloca las salidas intermedias en un archivo temporal. En bash, no creo que haya una sintaxis conveniente, tendría que administrar los archivos temporales usted mismo.Para zsh, el uso
=(command)
crea automáticamente un archivo temporal y lo reemplaza=(command)
con la ruta del archivo en sí. Con la sustitución de comandos,$(command)
se reemplaza con la salida del comando.Entonces hay tres opciones:
$(...)
<(...)
=(...)
La sustitución del proceso con sabor zsh, # 3, es muy útil y se puede usar así para comparar la salida de dos comandos usando una herramienta diff, por ejemplo, Beyond Compare:
Para Beyond Compare, tenga en cuenta que debe usar
bcomp
lo anterior (en lugar debcompare
) desde quebcomp
inicia la comparación y espera a que se complete. Si lo usabcompare
, se inicia la comparación y se cierra inmediatamente debido a que los archivos temporales creados para almacenar la salida de los comandos desaparecen.Lea más aquí: http://zsh.sourceforge.net/Intro/intro_7.html
También tenga en cuenta esto:
y la siguiente, que es la diferencia entre los dos tipos de sustitución de Procesos soportados por zsh (es decir, # 2 y # 3):
Referencia: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
fuente
$(...)
no es sustitución de proceso, es sustitución de comando .<(...)
es la sustitución del proceso Es por eso que el pasaje citado no menciona$(...)
en absoluto.Concha de pescado
En Fish Shell tienes que conectarlo a psub . Aquí hay un ejemplo de comparación de configuración heroku y dokku con Beyond Compare :
fuente
meld
la de código abierto y está disponible en los repositorios de Ubuntu y EPEL. meldmerge.orgA menudo uso la técnica descrita en la respuesta aceptada:
pero encuentro que generalmente lo uso con comandos mucho más complejos que el ejemplo anterior. En tales casos, puede ser molesto crear el comando diff. He encontrado algunas soluciones que otros pueden encontrar útiles.
Encuentro que el 99% del tiempo pruebo los comandos relevantes antes de ejecutar diff. En consecuencia, los comandos que quiero diferenciar están ahí en mi historia ... ¿por qué no usarlos?
Hago uso del comando Fix (fc) bash incorporado para ejecutar los últimos dos comandos:
Las banderas fc son:
se
-1
-1
refieren a la posición de inicio y fin en el historial, en este caso es desde el último comando hasta el último comando que produce solo el último comando.Por último, envolvemos esto
$()
para ejecutar el comando en una subshell.Obviamente, esto es un poco difícil de escribir para que podamos crear un alias:
O podemos crear una función:
que admite especificar las líneas del historial que se utilizarán. Después de usar ambos, encuentro que el alias es la versión que prefiero.
fuente