Pipe chemin d'accès à ImageJ

0

La question

J'ai un petit utilitaire en ligne de commande rjp2tif qui extrait les données radiométriques à partir d'un fichier jpeg dans un fichier tiff. J'espérais être en mesure de canaliser le chemin d'accès à ImageJ sur la ligne de commande et ont ImageJ ouvrir le fichier tiff. À cette fin, rjp2tif écrit le chemin d'accès du fichier tiff sur la sortie standard. J'ai essayé les en bash:

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

et

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

La première s'ouvre ImageJ, mais n'ouvre pas le fichier. La seconde s'ouvre ImageJ avec une fenêtre de texte avec le chemin en elle.

C'est sur macOS Monterey, mais je ne pense pas que les questions. Quelqu'un a essayé de faire cela et réussi? TIA.

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

La meilleure réponse

1

En supposant que le rjp2tif commande renvoie un chemin-fichier standard de sortie, et que vous souhaitez passer cette sortie comme un régulier de la CLI argument d'une autre commande, vous pouvez être intéressé par la xargs commande. Mais notez que dans le cas général, vous pouvez frapper un problème si le fichier chemin d'accès contient des espaces ou alors:

Lire l'espace, tabulation, saut de ligne et de fin de fichier délimité par des arguments à partir de l'entrée standard et exécuter le spécifiée utilitaire avec comme arguments.
Les arguments sont généralement une longue liste de noms de fichiers (généré par ls ou find, par exemple) qui sont passés à xargs par l'intermédiaire d'un tuyau.

Donc dans ce cas, en supposant que chaque fichier chemin d'accès ne prend qu'une ligne (ce qui est évidemment le cas si il n'y a qu'une seule ligne dans l'ensemble), vous pouvez utiliser la commande suivante NULà base de pointe s'appuyant sur l' tr commande.

Voici la commande que vous aimerais obtenir:

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

Note: j'ai un GNU/Linux OS, de sorte que pouvez-vous confirmer qu'il fonctionne sous macOS?

FTR, ci-dessous est une vaste coquille code permettant de tester les deux modes différents de xargs: génération d'une commande par ligne-argument (-n1), ou une commande unique avec tous les arguments d'un seul coup:

$ 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 Oui, l' tr la commande ci-dessus ne fonctionne sur macOS, merci. J'ai trouvé que le -t option (trace) pour xargs est utile pour montrer ce qu' xargs fait à la commande. Dans le cas ici, quand path/to/tiff est passé à xargs via le tuyau, xargs réorganise la commande à open -a imagej path/to/tiff. Très utile.
Jim Merkel

@ErickMD Une autre chose, vous avez mentionné ci-dessus qu'il y a une ligne sur la sortie standard à partir de rjp2tif qui est redirigé vers xargs. Toutefois il pourrait y avoir beaucoup de lignes de sortie standard si j'utilise un -v option pour rjp2tif. Cela peut fonctionner aussi si j'utilise tee /dev/tty pour afficher toutes les lignes sur l'écran, suivi par tail -n 1 pour obtenir juste la dernière ligne de tuyauterie xargs. Dans ce cas, la ligne de commande est: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. J'ai laissé de côté l' tr commande de simplification.
Jim Merkel

Oui, mais xargs peut également prendre en charge plusieurs lignes en entrée comme je l'ai mentionné dans ma réponse, et vous avez 2 choix dans ce cas: soit utiliser un open commande pour chaque fichier → xargs -0 -n1 open -a imagej; ou exécuter une seule open commande avec tous les fichiers passés comme arguments → xargs -0 open -a imagej. Si vous n'avez pas besoin tail -n 1 à tous (sauf si vous êtes intéressé dans un seul fichier, bien sûr)
ErikMD

En fait, je suppose que j'ai mal interprété votre commentaire: avec le -v option, vous n'avez pas plusieurs fichiers voies impliquées, mais juste de quelques autres "parasites" qui peuvent être retirés de la sortie standard en utilisant tail -n 1en effet.
ErikMD

Oui, rjp2tif fonctionne avec un fichier à l'heure actuelle. L' -v est verbeux. De sorte que le "bruit" est une impression de métadonnées du fichier. Je suppose que je pourrais essayer de le faire rjp2tif travailler pour plusieurs fichiers.
Jim Merkel

Dans d'autres langues

Cette page est dans d'autres langues

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