bash读取-d''有什么作用?

时间:2019-08-14 15:04:08

标签: bash delimiter readline

File "d:\python\python37\lib\site-packages\pandas\io\excel\_base.py", line 356, in __init__ filepath_or_buffer.seek(0) UnsupportedOperation: seek 在bash读取命令中做什么?该示例直接来自a previous SO。从read命令显示的用法来看,它说@db.Tache.FirstOrDefault(x => x.id == item.EmployeID).coloring; @db.Employe.FirstOrDefault(x => x.id == item.EmployeID).naming; 选项定义了在行中分割单词的分隔符。空定界符有什么作用?

-d ''

通过实验,我知道该变量被分配了多行。没有它,只分配第一行。似乎很难根据用法文本来解释此行为。

2 个答案:

答案 0 :(得分:5)

在bash read中,内置的空字符串定界符-d ''的行为与将定界符用作 NUL 字节或$'\0'(由ANSI C引用的字符串定义)相同)或十六进制表示形式0x0

-d ''指定每条输入行应由NUL字节分隔。这意味着在每次调用read时,将读取输入字符串直到下一个NUL字符。

通常它与IFS=一起使用,如下:

IFS= read -r -d ''

用于修剪输入中的前导和尾随空白。

处理NUL分隔输入的常见示例是:

while IFS= read -r -d '' file; do
    echo "$file"
done < <(find . -type f -print0)
  • find命令正在使用NUL作为每个条目之间的分隔符来打印当前目录中的文件。
  • read -d ''\0设置为定界符,以便一次从find命令的输出中读取一个条目。

相关Why ‘read’ doesn’t accept \0 as a delimiter in this example?

答案 1 :(得分:4)

read -d将停止读取的字符从默认换行符更改为以下参数的第一个字符。

要了解的重要一点是bash使用C字符串,这些字符串由文字NUL终止。因此,当后面的参数是''时,第一个(也是唯一的)字符是NUL终止它;因此,当外壳程序取消引用char*以获取其指向的第一个字符时,它将获得NUL。


现在,当您使用<<EOF重定向Heredoc时,该文档中实际上将没有任何NUL,那么您的代码如何工作?

答案是您的代码期望read操作失败。即使失败,read仍会填充其目标变量。因此,如果您没有终止定界符,read的退出状态将为非零...但是无论如何,它仍会将您要收集的所有数据放入变量中!

对于不触发set -e错误的版本,请考虑在读取完成后检查目标变量是否为空:

{ IFS= read -r -d '' string || [[ $string ]]; } <<'EOF'
...string goes here...
EOF

我们做了哪些更改?

  • IFS=防止剥离前导或尾随空格(或其他字符,如果已重新定义IFS)。
  • read -r防止对带有反斜杠文字的内容进行修饰。
  • || [[ $string ]]的意思是,如果read报告失败,则我们检查字符串是否已填充,并且如果变量为非空,则仍认为总体命令成功。