命令行参数由空字符分隔

时间:2013-09-15 12:21:43

标签: bash shell parameters realpath ifs

由于文件名可能包含空格和新行\n,因此我使用空字符作为字段分隔符。但我不知道如何对find说输入目录是空字符分隔。

我失败的尝试:

foo()
{
  IFS='\0'
  find "$@"
}

$ mkdir 'oneword' 'two words'
$ IFS='\0' foo $(realpath -z 'oneword' 'two words')

如何告诉find输入目录是否用零分隔?

1 个答案:

答案 0 :(得分:2)

一种方法是使用xargs:

realpath -z 'oneword' 'two words' | xargs -0 find

或者:

foo() {
  local A=() I=0 IFS=''
  while read -rd $'\0' A[I++]; do :; done 
  find "${A[@]}"
}
realpath -z 'oneword' 'two words' | foo  ## Under subshell or pipe
foo < <(realpath -z 'oneword' 'two words')  ## No subshell

如果需要,您可以使用另一个fd:

foo() {
  local A=() I=0 IFS=''
  while read -rd $'\0' -u 4 A[I++]; do :; done 
  find "${A[@]}"
}
foo 4< <(realpath -z 'oneword' 'two words')

注意:使用IFS将变量的值拆分为多个参数可能会导致路径名扩展,并且不值得称道。它还需要修改IFS,这可能会影响其他功能。