|-转 shi gan sha de sed -E 's/^[[:space:]]*listen[[:space:]]+([^;]+);?.*$/\1/' | \
20250926
`| \` 是 **Bash 脚本中的“行继续符”**,意思是:
> “这行还没结束,下一行是它的延续。”
***
### ✅ 详细解释
你写的:
<pre style="background: none"><code class="language-bash" data-language="bash" identifier="2a747c62ec71481895a43d57eff84eb2-0" index="0" total="8">grep -E "^\s*listen" "$conf_file" | \
sed -E 's/^[[:space:]]*listen[[:space:]]+([^;]+);?.*$/\1/' | \
while read -r line; do
...
done | \
sort -u | \
tr '\n' ' ' | \
sed 's/ $//' || echo ""</code></pre>
这里的每一个 `| \` 都表示:
* `|`:管道,把前一个命令的输出传给下一个命令
* `\`:换行符,告诉 shell “命令还没完,继续读下一行”
***
### ✅ 为什么需要它?
因为如果不加 `\`,Bash 会认为每行是一个独立命令。
比如:
<pre style="background: none"><code class="language-bash" data-language="bash" identifier="2a747c62ec71481895a43d57eff84eb2-1" index="1" total="8">grep ... |
sed ... |
while ...</code></pre>
Bash 会报错:
<pre style="background: none"><code identifier="2a747c62ec71481895a43d57eff84eb2-2" index="2" total="8">语法错误:未预期的符号 `|'</code></pre>
因为 `grep ... |` 是个不完整的管道。
***
### ✅ 等价于(去掉 `\`)
如果你写成一行(不推荐,太长):
<pre style="background: none"><code class="language-bash" data-language="bash" identifier="2a747c62ec71481895a43d57eff84eb2-3" index="3" total="8">grep -E "^\s*listen" "$conf_file" | sed -E 's/^[[:space:]]*listen[[:space:]]+([^;]+);?.*$/\1/' | while read -r line; do ...; done | sort -u | tr '\n' ' ' | sed 's/ $//' || echo ""</code></pre>...