Potrubí filepath do ImageJ

0

Otázka

Mám malý nástroj příkazového řádku rjp2tif to výtažky radiometrická data z jpeg souborů do formátu tiff. Doufala jsem, že budu moci potrubí filepath do ImageJ na příkazovém řádku a ImageJ otevřít soubor s příponou tiff. Za tímto účelem, rjp2tif píše filepath z tiff souboru na standardní výstup. Zkoušel jsem následující v bashi:

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

a

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

První se otevírá ImageJ ale neotevře soubor. Druhý otevírá ImageJ s textové okno s filepath.

To je na macOS Monterey, ale nemyslím si, že záleží. Někdo se snažil udělat to a byl úspěšný? TIA.

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

Nejlepší odpověď

1

Za předpokladu, že rjp2tif příkaz vrátí souboru-cestu na standardní výstup, a chcete předat tento výstup jako pravidelné CLI argument jiného příkazu, můžete být zájem xargs příkaz. Ale všimněte si, že v obecném případě může zasáhnout nějaký problém, pokud soubor-cesta obsahuje mezery nebo tak:

Přečtěte si mezery, tabulátoru, nového řádku a end-of-file delimited argumenty ze standardního vstupu a spustit zadaný utility s nimi jako argumenty.
Argumenty jsou typicky dlouhý seznam názvů souborů (generovaných ls nebo findpro příklad), že si prošel k xargs prostřednictvím potrubí.

Takže v tomto případě, za předpokladu, že každý soubor-cesta trvá jen jeden řádek (což je samozřejmě v případě, pokud je tam jen jeden řádek celkově), můžete použít následující NULna bázi tip spoléhat na tr příkaz.

Zde je příkaz byste získat:

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

Poznámka: mám GNU/Linux OS, takže můžete prosím potvrdit, že to funguje pod macOS?

FTR, níže je komplexní shell kódu, což umožňuje, aby vyzkoušel dva různé režimy xargs: vytváří jeden příkaz na řádek-argument (-n1), nebo jeden příkaz s line-argumenty na jeden zátah:

$ 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 Ano, tr příkaz výše funguje na macOS, díky. Zjistil jsem, že -t možnost (stopy) xargs je užitečné ukázat, co xargs dělá příkaz. V případě, když path/to/tiff je předán xargs prostřednictvím potrubí, xargs uspořádá příkaz open -a imagej path/to/tiff. Velmi užitečné.
Jim Merkel

@ErickMD Jedna další věc, kterou jste zmínil výše, že tam je jeden řádek na standardní výstup z rjp2tif to je napojeno na xargs. Nicméně tam by mohlo být mnoho řádků na standardní výstup, pokud mohu použít -v možnost rjp2tif. Může to fungovat také, pokud mohu použít tee /dev/tty ukázat všechny řádky na obrazovce, následuje tail -n 1 jen ten poslední řádek pro potrubí xargs. V tomto případě je příkazový řádek: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. Vynechal jsem tr příkaz pro zjednodušení.
Jim Merkel

Ano, ale xargs mohou také podporovat více řádků ve vstupních jak jsem se zmínil ve své odpovědi, a budete mít 2 možnosti, v tomto případě: buď spustit jeden open příkaz pro každý soubor → xargs -0 -n1 open -a imagej; nebo spustit jeden open příkaz se všemi soubory předán jako args → xargs -0 open -a imagej. Takže se nemusíte tail -n 1 (pokud vás zajímá pouze jeden soubor, samozřejmě)
ErikMD

Vlastně myslím, že jsem si špatně vyložil vaši poznámku: s -v možnost, nebudete mít několik souborů-cesty se účastní, ale jen nějaký další "šum", který může být odstraněn z stdout pomocí tail -n 1,, opravdu.
ErikMD

Ano, rjp2tif jen pracuje s jedním souborem v současné době. Na -v je upovídaný. Takže ten "šum" je tisk z metadat pro soubor. Myslím, že bych to mohla zkusit a udělat rjp2tif práce pro více souborů.
Jim Merkel

V jiných jazycích

Tato stránka je v jiných jazycích

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