符合POSIX标准的shell相当于Bash“同时读取-d $'\ 0'......”?

时间:2016-05-20 09:21:31

标签: bash shell find pipe sh

我正在努力使Bash脚本严格符合POSIX标准,即使用checkbashisms -px ${script_filename}删除任何潜在的“Bashisms”。在给定文件中,我使用find遍历目录,然后使用read作为分隔符将每个文件路径传递到\0,以便能够使用-print0处理包含换行符的文件名:

find . -print0 | while read -d $'\0' inpath
do
    echo "Reading path \"${inpath}\"."
done

但是,checkbashisms不喜欢这样,因为the option -d isn't strictly POSIX-compliant

  

可能的基础...行 n (使用-r以外的选项读取)

如何编写符合POSIX标准的等效代码,即使用非换行符分隔符从find读取输出?

1 个答案:

答案 0 :(得分:3)

如果没有-d选项,read builtin无法读取空终止数据。

您可以在find + xargs

中执行此操作
find . -mindepth 1 -print0 | xargs -0 sh -c 'for f; do echo "Reading path \"$f\""; done' _

或者,如果您不介意为每个文件生成一个shell,请使用find

find . -mindepth 1 -exec sh -c 'echo "Reading path \"$1\""' - {} \;