Tubería ruta del archivo a ImageJ

0

Pregunta

Tengo una pequeña utilidad de línea de comandos rjp2tif que extrae los datos radiométricos de un archivo jpeg en un archivo tiff. Tenía la esperanza de ser capaz de canalizar la ruta del archivo a ImageJ en la línea de comandos y tiene ImageJ abrir el archivo tiff. Para este fin, rjp2tif escribe la ruta de acceso del archivo tiff a la salida estándar. He intentado lo siguiente en bash:

$ rjp2tif /path/to/rjpeg | open -a imagej

y

$ rjp2tif /path/to/rjpeg | open -a imagej -f

La primera abre el ImageJ pero no abre el archivo. El segundo se abre ImageJ con una ventana de texto con la ruta del archivo en ella.

Esto es en macOS Monterey, pero no creo que importa. Cualquier persona que trató de hacer esto y ha tenido éxito? TIA.

bash macos
2021-11-23 23:05:07
1

Mejor respuesta

1

Suponiendo que el rjp2tif comando devuelve un archivo de la ruta en la salida estándar, y desea pasar esta salida como un regular CLI argumento a otro comando, usted puede estar interesado en el xargs comando. Pero tenga en cuenta que en el caso general, usted puede golpear a algún problema de si el archivo de la ruta contiene espacios o así:

Leer el espacio, tabulador, nueva línea y de fin de archivo delimitado por los argumentos de la entrada estándar y ejecutar el especificado utilidad con ellos como argumentos.
Los argumentos son típicamente una larga lista de nombres de archivos (generado por ls o find, por ejemplo) que han pasado a xargs a través de un tubo.

Así que en este caso, suponiendo que cada archivo de la ruta toma sólo una línea (que es obviamente el caso si sólo hay una línea general), puede utilizar el siguiente NULbasado en la punta de confiar en el tr comando.

Este es el comando que iba a obtener:

rjp2tif /path/to/rjpeg | tr '\n' '\0' | xargs -0 open -a imagej

Nota: tengo un GNU/Linux, así que por favor puede confirmar que funciona bajo macOS?

FTR, a continuación es un completo código de shell que permite a uno para poner a prueba dos modos diferentes de xargs: la generación de un comando por línea-argumento (-n1), o un comando único con toda la línea de los argumentos en uno:

$ printf 'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 -n1 \
  bash -c 'printf "Run "; for a; do printf "\"$a\" "; done; echo' bash
Run "one " 
Run "two" 
Run "three and four" 

$ printf 'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 \
  bash -c 'printf "Run "; for a; do printf "\"$a\" "; done; echo' bash
Run "one " "two" "three and four" 

######################################
# or alternatively (with no for loop):
######################################

$ printf 'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 -n1 \
  bash -c 'printf "Run "; printf "\"%s\" " "$@"; echo' bash
Run "one " 
Run "two" 
Run "three and four" 

$ printf 'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 \
  bash -c 'printf "Run "; printf "\"%s\" " "$@"; echo' bash
Run "one " "two" "three and four" 
2021-11-24 14:55:40

@ErickMD Sí, la tr la orden tiene por encima funciona en macOS, gracias. He encontrado que la -t opción (trace) para xargs es útil para mostrar lo que xargs ¿para el comando. En el caso aquí, cuando path/to/tiff se pasa a xargs a través de la tubería, xargs reorganiza el comando open -a imagej path/to/tiff. Muy útil.
Jim Merkel

@ErickMD Una cosa más, que se mencionó anteriormente que hay una línea en la salida estándar de rjp2tif que se canaliza a xargs. Sin embargo, podría haber muchas líneas a la salida estándar si yo uso un -v opción a rjp2tif. Esto puede funcionar también si puedo usar tee /dev/tty para mostrar todas las líneas en la pantalla, seguido por tail -n 1 para obtener sólo la última línea de la tubería para xargs. En este caso la línea de comandos es: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. Me fui de la tr comando para la simplificación.
Jim Merkel

Sí, pero xargs también puede admitir varias líneas en entrada como mencioné en mi respuesta, y tienes 2 opciones, en este caso: o bien ejecutar una open comando para cada archivo → xargs -0 -n1 open -a imagej; o ejecutar una sola open comando con todos los ficheros pasados como argumentos → xargs -0 open -a imagej. Así que usted no necesita tail -n 1 a todos (a menos que usted está interesado en un solo archivo, por supuesto)
ErikMD

En realidad supongo que malinterpretado su comentario: con la -v opción, no tienes varios archivos rutas involucradas, sino sólo algunos adicionales "ruido" que puede ser removido de la salida estándar (stdout) mediante el uso de tail -n 1de hecho.
ErikMD

Sí, rjp2tif sólo trabaja con archivos de uno en la actualidad. El -v es para el detallado. Así que el "ruido" es una impresión de los metadatos del archivo. Supongo que podría intentar hacer rjp2tif trabajo para varios archivos.
Jim Merkel

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................