Ścieżka do pliku kanału w ImageJ

0

Pytanie

Mam małe narzędzie wiersza polecenia rjp2tif to pobiera радиометрические dane z pliku jpeg do pliku tiff. Miałem nadzieję, że będę mógł przekazać ścieżkę do pliku w ImageJ w wierszu polecenia i zmusić ImageJ otworzyć plik tiff. W tym celu, rjp2tif zapisuje ścieżkę do pliku tiff na standardowe wyjście. Próbowałem w następujący bash:

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

i

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

Pierwszy otwiera ImageJ, ale nie otwiera plik. Drugi otwiera ImageJ pola tekstowego, w którym jest podana ścieżka do pliku.

To na macOS Monterey, ale nie sądzę, że to ma znaczenie. Czy ktoś próbował to zrobić i osiągnąć sukces? TIA.

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

Najlepsza odpowiedź

1

Zakładając, że rjp2tif zespół zwraca ścieżkę do pliku w standardowym wyjściu, i chcesz przekazać ten wniosek jako zwykły argument CLI innej drużynie, może cię zainteresowaćxargs zespół. Ale należy pamiętać, że w ogólnym przypadku można spotkać się z pewnym problemem, jeśli ścieżka zawiera spacje lub około tego:

Rozważ argumenty, oddzielone spacją, karty, nowej wierszem i końcem pliku, z standardowych danych wejściowych i wykonaj podaną narzędzia z nimi jako argumentów.
Argumenty zazwyczaj stanowią długą listę nazw plików (wygenerowany ls lub find, na przykład), które są przekazywane w xargs na rurze.

Dlatego w tym przypadku, zakładając, że każda ścieżka do pliku zajmuje tylko jedną linię (co, oczywiście, ma miejsce, jeśli w ogóle jest tylko jeden wiersz), można korzystać z następujących czynności NUL-to opis generowany w oparciu rada natr zespół.

Oto zespół, który otrzymasz:

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

Uwaga: mam SYSTEMU operacyjnego GNU/Linux, więc nie można potwierdzić, że działa pod macOS?

FTR, poniżej znajduje się pełny kod powłoki, który pozwala przetestować w dwóch różnych trybach xargs: tworzenie jednej drużyny na argument wiersza (-n1), lub jedna drużyna ze wszystkimi argumentami wiersza za jednym razem:

$ 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 Tak, w tr zespół, który podałeś wyżej, działa na macOS, dziękuję. Odkryłem, że -t opcja (śledzenie) dla xargs przydatne, aby pokazać, że xargs wykonuje polecenie. W tym przypadku, gdy path/to/tiff przekazywane w xargs na rurze xargs zmienia kolejność wykonywania polecenia open -a imagej path/to/tiff. Bardzo pomocne.
Jim Merkel

@ErickMD Jeszcze jedna rzecz, o którym wspomniałeś wyżej, że jest jeden wiersz standardowego wyjścia z rjp2tif to jest przekazywane w rurociągu xargs. Jednak w standardowym wyjściu może być wiele wierszy, jeśli używam -v możliwość rjp2tif. To również może zadziałać, jeśli używam tee /dev/tty aby wyświetlić wszystkie polecenia na ekranie, za którymi należy tail -n 1 aby uzyskać najnowszą linię do podłączenia do xargs. W tym przypadku wiersz polecenia: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. Straciłem z oczu tr zespół dla uproszczenia.
Jim Merkel

Tak, ale xargs może również obsługiwać kilka linii tekstu, jak wspomniałem w swojej odpowiedzi, i w tym przypadku masz 2 opcje: albo uruchomić jedną open zespół dla każdego pliku → xargs -0 -n1 open -a imagej; lub uruchomić jeden open drużyna ze wszystkimi plikami, przekazane jako argumenty → xargs -0 open -a imagej. Tak, że nie trzeba tail -n 1 w ogóle (jeśli, oczywiście, nie interesuje cię tylko jeden plik)
ErikMD

W rzeczywistości, myślę, że źle odczytałem twoje uwaga: z -v opcja, masz kilka ścieżek do plików, a tylko jakiś artykuł "szum", który można usunąć z stdout z pomocą tail -n 1 naprawdę.
ErikMD

TAK, rjp2tif obecnie działa tylko z jednym plikiem. To -v to pustosłowie. W ten sposób, "szum" - jest to wydruk metadanych do pliku. Myślę, że mógłbym spróbować zrobić rjp2tif praca z wieloma plikami.
Jim Merkel

W innych językach

Ta strona jest w innych językach

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