Tubo filepath para ImageJ

0

Pergunta

Eu tenho um pequeno utilitário de linha de comando rjp2tif que extrai dados radiométricos a partir de um arquivo jpeg em um arquivo tiff. Eu estava esperando para ser capaz de canalizar o caminho para o ImageJ na linha de comandos e tem ImageJ abrir o arquivo tiff. Para este fim, rjp2tif escreve o caminho de arquivo do arquivo tiff para a saída padrão. Eu tentei o seguinte no bash:

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

e

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

O primeiro abre ImageJ, mas não abrir o arquivo. O segundo abre ImageJ com uma janela de texto com o arquivo nele.

Este é o macOS Monterey, mas eu não acho que importa. Alguém tentou fazer isso e foi bem sucedido? TIA.

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

Melhor resposta

1

Supondo que o rjp2tif o comando retorna um arquivo-caminho na saída padrão, e você quer passar esta saída como uma regular CLI argumento para outro comando, você pode estar interessado em xargs de comando. Mas note que, no caso geral, você pode acertar algum problema se o caminho do ficheiro contiver espaços ou então:

Leia espaço, tabulação, nova linha e o fim-de-arquivo delimitado argumentos a partir da entrada padrão e executar o especificado utilitário com eles como argumentos.
Os argumentos são, normalmente, de uma longa lista de nomes de arquivo (gerado pelo ls ou find, por exemplo) que se passou a xargs através de uma tubulação.

Portanto, neste caso, assumindo que cada arquivo-caminho leva apenas uma linha (o que obviamente é o caso, se há apenas uma linha geral), você pode usar o seguinte NULbaseada em sugestão depender de tr de comando.

Aqui é o comando que você gostaria de obter:

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

Nota: eu tenho um GNU/Linux OS, de modo que você pode por favor confirmar que ele funciona em macOS?

FTR, abaixo é um abrangente código do shell, permitindo que um teste de dois modos diferentes de xargs: geração de um comando por linha de argumento (-n1), ou um único comando com toda a linha de argumentos de uma só vez:

$ 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 Sim, o tr comando você tem acima funciona em macOS, obrigado. Eu achei que o -t opção (rastreamento) para xargs é útil para mostrar o que xargs não para o comando. No caso aqui, quando path/to/tiff é passado para xargs através do tubo, xargs reorganiza o comando para open -a imagej path/to/tiff. Muito útil.
Jim Merkel

@ErickMD Uma coisa, que você mencionou acima que há uma linha para a saída padrão de rjp2tif que é canalizada xargs. No entanto, não poderia ser de muitas linhas para a saída padrão, se eu usar um -v opção para rjp2tif. Isso pode funcionar, também, se eu usar tee /dev/tty para mostrar todas as linhas na tela, seguido por tail -n 1 para obter apenas a última linha para a tubulação para xargs. Neste caso, a linha de comando é: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. Eu deixei de fora a tr comando para simplificação.
Jim Merkel

Sim, mas xargs também pode suportar várias linhas de entrada, como mencionei em minha resposta, e você tem 2 escolhas, neste caso: ou executar um open comando para cada arquivo → xargs -0 -n1 open -a imagej; ou a execução de uma única open comando com todos os arquivos passados como argumentos → xargs -0 open -a imagej. Assim você não precisa tail -n 1 a todos (a menos que você está interessado em apenas um arquivo, é claro)
ErikMD

Na verdade, eu acho que eu mal interpretado o seu comentário: com o -v opção, você não precisa de vários arquivos-caminhos envolvidos, mas apenas alguns adicionais "ruído" que pode ser removido usando o stdout tail -n 1, na verdade.
ErikMD

Sim, rjp2tif só funciona com um arquivo no presente. O -v é verbosa. Assim, o "ruído" é uma impressão de metadados para o arquivo. Eu acho que eu poderia tentar fazer rjp2tif trabalho para vários arquivos.
Jim Merkel

Em outros idiomas

Esta página está em outros idiomas

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