我有一個小的命令列實用程式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。
uj5u.com熱心網友回復:
假設該rjp2tif命令在標準輸出中回傳一個檔案路徑,并且您希望將此輸出作為常規 CLI 引數傳遞給另一個命令,您可能對該xargs命令感興趣。但請注意,在一般情況下,如果檔案路徑包含空格左右,您可能會遇到一些問題:
從標準輸入中讀取空格、制表符、換行符和檔案結尾分隔的引數,并使用它們作為引數執行指定的實用程式。
引數通常是通過管道傳遞給的一長串檔案名(例如由ls或生成find)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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365311.html
