【问题标题】:Pipe filepath to ImageJ管道文件路径到 ImageJ
【发布时间】:2022-01-02 10:03:13
【问题描述】:

我有一个小的命令行实用程序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 上,但我认为这并不重要。 有人尝试过这样做并成功了吗? TIA。

【问题讨论】:

  • 我想你会想要open -a imagej "$(rjp2tif /path/to/rjpeg)"
  • 或者你可以做rjp2tif /path/to/rjpeg | xargs open -a imagej
  • 这将是更多... main stream?rjp2tif 添加第二个参数以保存其输出,以便您可以像这样使用它:@987654328 @
  • ErikMD 和 Mark Setchell 好的,这两种方法都有效。我以为我以前尝试过 xargs 命令。我想我必须阅读手册页才能了解 xargs 的工作原理。 ErikMD 您可以将其发布为答案,我会接受。 @Fravadona tiff 文件保存在与 rjpeg 文件相同的文件夹中。

标签: bash macos


【解决方案1】:

假设rjp2tif 命令在标准输出中返回一个文件路径,并且您想将此输出作为常规CLI 参数传递给另一个命令,您可能对xargs 命令感兴趣。但请注意,在一般情况下,如果文件路径包含空格左右,您可能会遇到一些问题:

从标准输入中读取空格、制表符、换行符和文件结尾分隔的参数,并将它们作为参数执行指定的实用程序。
参数通常是一长串文件名(例如由lsfind 生成),它们通过管道传递给xargs

所以在这种情况下,假设每个文件路径只占用一行(如果整体只有一行,显然是这种情况),您可以使用以下基于 NUL 的提示,依赖于 tr 命令。

这是您将获得的命令:

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

注意:我有一个 GNU/Linux 操作系统,请问您能否确认它在 macOS 下工作?

FTR,下面是一个全面的 shell 代码,可以测试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" 

【讨论】:

  • @ErickMD 是的,您上面的tr 命令确实适用于 macOS,谢谢。我发现xargs-t 选项(跟踪)有助于显示xargs 对命令的作用。在这种情况下,当path/to/tiff 通过管道传递给xargs 时,xargs 将命令重新排列为open -a imagej path/to/tiff。非常有用。
  • @ErickMD 另外一件事,您在上面提到了从rjp2tif 到标准输出的一行通过管道传输到xargs。但是,如果我对rjp2tif 使用-v 选项,标准输出可能会有很多行。如果我使用tee /dev/tty 在屏幕上显示所有行,然后使用tail -n 1 将最后一行用于管道到xargs,这也可以工作。在这种情况下,命令行是:rjp2tif -v /path/to/rjpeg | tee /dev/tty | tail -n 1 | xargs open -a imagej。为了简化,我省略了tr 命令。
  • 是的,但是xargs 也可以支持多行输入,正如我在回答中提到的那样,在这种情况下您有两种选择:为每个文件运行一个open 命令→@987654353 @;或运行单个 open 命令,所有文件都作为 args → xargs -0 open -a imagej 传递。所以你根本不需要tail -n 1(当然,除非你只对一个文件感兴趣)
  • 实际上我想我误解了您的评论:使用-v 选项,您没有涉及多个文件路径,而只是一些额外的“噪音”,可以使用@从标准输出中删除987654358@,确实如此。
  • 是的,rjp2tif 目前只适用于一个文件。 -v 用于详细说明。所以“噪音”是文件元数据的打印。我想我可以尝试让rjp2tif 为多个文件工作。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多