min*_*hua 4 bash readline delimiter
什么是一个-d ''在bash读取命令吗?该示例直接来自先前的SO。从read命令打印的用法来看,它说该-d选项定义了用于在一行中分割单词的定界符。空定界符有什么作用?
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
Run Code Online (Sandbox Code Playgroud)
通过实验,我知道该变量被分配了多行。没有它,只分配第一行。似乎很难根据用法文本来解释此行为。
read -d 将停止读取的字符从默认换行符更改为以下参数的第一个字符。
要理解的重要一点是 bash 使用 C 字符串,这些字符串以文字 NUL 终止。因此,当以下参数是 时'',第一个(也是唯一的)字符是终止它的 NUL;因此,当 shell 取消引用char*以获得它指向的第一个字符时,它会得到一个 NUL。
现在,当您使用 重定向heredoc 时<<EOF,该文档实际上不会包含任何 NUL——那么您的代码是如何工作的?
答案是您的代码期望read操作失败。即使失败,read仍然填充其目标变量;因此,如果您没有终止分隔符,read则退出状态为非零……但无论如何它仍会将您想要收集的所有数据放入变量中!
对于不触发set -e错误的版本,可以考虑在读取完成后检查目标变量是否为空:
{ IFS= read -r -d '' string || [[ $string ]]; } <<'EOF'
...string goes here...
EOF
Run Code Online (Sandbox Code Playgroud)
我们做了哪些改变?
IFS= 防止前导或尾随空格(或其他字符,如果 IFS 已重新定义)被剥离。read -r 防止带有反斜杠文字的内容被破坏。|| [[ $string ]]意味着如果read报告失败,我们然后检查字符串是否被填充,如果变量非空,仍然认为整个命令成功。在bash read内置的空字符串定界符中,-d ''其行为与将定界符用作NUL字节或$'\0'(由ANSI C引用的字符串定义)或十六进制表示形式相同0x0。
-d ''指定每个输入行应由NUL字节定界。这意味着在每次调用时,将读取输入字符串直到下一个NUL字符read。
通常将其用于IFS=:
IFS= read -r -d ''
Run Code Online (Sandbox Code Playgroud)
用于修剪输入中的前导和尾随空格。
处理NUL分隔输入的常见示例是:
while IFS= read -r -d '' file; do
echo "$file"
done < <(find . -type f -print0)
Run Code Online (Sandbox Code Playgroud)
find 命令正在使用NUL作为每个条目之间的分隔符来打印当前目录中的文件。 read -d ''设置\0为定界符,以便一次从find命令输出中读取一个条目。相关:在此示例中,为什么“ read”不接受\ 0作为分隔符?
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |