Путь к файлу канала в ImageJ

0

Вопрос

У меня есть небольшая утилита командной строки rjp2tif это извлекает радиометрические данные из файла jpeg в файл tiff. Я надеялся, что смогу передать путь к файлу в ImageJ в командной строке и заставить ImageJ открыть файл tiff. С этой целью, rjp2tif записывает путь к файлу tiff в стандартный вывод. Я попробовал следующее в bash:

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

и

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

Первый открывает ImageJ, но не открывает файл. Второй открывает ImageJ с текстовым окном, в котором указан путь к файлу.

Это на macOS Monterey, но я не думаю, что это имеет значение. Кто - нибудь пытался это сделать и добился успеха? ТИА.

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

Лучший ответ

1

Предполагая, что rjp2tif команда возвращает путь к файлу в стандартном выводе, и вы хотите передать этот вывод в качестве обычного аргумента CLI другой команде, вас может заинтересоватьxargs команда. Но обратите внимание, что в общем случае вы можете столкнуться с некоторой проблемой, если путь к файлу содержит пробелы или около того:

Считайте аргументы, разделенные пробелом, вкладкой, новой строкой и концом файла, из стандартных входных данных и выполните указанную утилиту с ними в качестве аргументов.
Аргументы обычно представляют собой длинный список имен файлов (сгенерированный ls или find, например), которые передаются в xargs по трубе.

Поэтому в этом случае, предполагая, что каждый путь к файлу занимает только одну строку (что, очевидно, имеет место, если в целом есть только одна строка), вы можете использовать следующее NUL-основанный совет, основанный наtr команда.

Вот команда, которую вы получите:

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

Примечание: У меня есть ОС GNU/Linux, поэтому не могли бы вы подтвердить, что она работает под macOS?

FTR, ниже приведен полный код оболочки, позволяющий протестировать два различных режима xargs: создание одной команды на аргумент строки (-n1), или одна команда со всеми аргументами строки за один раз:

$ 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 Да, в tr команда, которую вы указали выше, работает на macOS, спасибо. Я обнаружил, что -t опция (трассировка) для xargs полезно показать, что xargs выполняет команду. В данном случае, когда path/to/tiff передается в xargs по трубе, xargs изменяет порядок выполнения команды на open -a imagej path/to/tiff. Очень полезно.
Jim Merkel

@ErickMD Еще одна вещь, вы упомянули выше, что есть одна строка для стандартного вывода из rjp2tif это передается по трубопроводу в xargs. Однако в стандартном выводе может быть много строк, если я использую -v возможность rjp2tif. Это также может сработать, если я использую tee /dev/tty чтобы отобразить все строки на экране, за которыми следует tail -n 1 чтобы просто получить последнюю строку для подключения к xargs. В этом случае командная строка: rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej. Я упустил из виду tr команда для упрощения.
Jim Merkel

Да, но xargs также может поддерживать несколько строк ввода, как я упоминал в своем ответе, и в этом случае у вас есть 2 варианта: либо запустить одну open команда для каждого файла → xargs -0 -n1 open -a imagej; или запустить один open команда со всеми файлами, переданными в качестве аргументов → xargs -0 open -a imagej. Так что вам не нужно tail -n 1 вообще (если, конечно, вас не интересует только один файл)
ErikMD

На самом деле, я думаю, что неправильно истолковал ваше замечание: с -v опция, у вас нет нескольких путей к файлам, а только некоторый дополнительный "шум", который можно удалить из stdout с помощью tail -n 1 действительно.
ErikMD

ДА, rjp2tif в настоящее время работает только с одним файлом. То -v это для многословия. Таким образом, "шум" - это распечатка метаданных для файла. Я думаю, я мог бы попытаться сделать rjp2tif работайте с несколькими файлами.
Jim Merkel

На других языках

Эта страница на других языках

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