我有一个小的命令行实用程序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蒙特利,但我认为这不重要。有人想这么做却成功了吗?蒂娅。
发布于 2021-11-24 11:12:43
假设rjp2tif命令在标准输出中返回文件路径,并且希望将此输出作为常规的CLI参数传递给另一个命令,那么您可能对xargs命令感兴趣。但请注意,在一般情况下,如果文件路径包含空格左右,则可能会遇到一些问题:
从标准输入中读取空格、制表符、换行符和文件尾分隔参数,并使用它们作为参数执行指定的实用程序。
这些参数通常是一个很长的文件名列表(例如,由ls或find生成),通过管道传递给xargs。
因此,在本例中,假设每个文件路径只使用一行(如果整个文件路径只有一行,则显然是这样),您可以依赖于NUL命令使用下面的tr提示。
下面是您将获得的命令:
rjp2tif /path/to/rjpeg | tr '\n' '\0' | xargs -0 open -a imagej注意:我有一个GNU/Linux,所以请您确认它在macOS下工作吗?
下面是一个完整的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" https://stackoverflow.com/questions/70088899
复制相似问题