为什么 bash 之后用文本替换命令替换中的文本

Chr*_*Rau 4 bash echo cat command-substitution for

我试图解析一些 nginx 配置

? tree sites-enabled/ sites-available/
sites-enabled/
??? bank.cwrcoding.com.conf
??? calendar.cwrcoding.com.conf
??? cloud.cwrcoding.com.conf
??? cwrcoding.com.conf
??? drive.cwrcoding.com.conf
??? groups.cwrcoding.com.conf
??? mail.cwrcoding.com.conf
??? sites.cwrcoding.com.conf
??? studentenverwaltung.cwrcoding.com.conf
??? wekan.cwrcoding.com.conf
??? www.cwrcoding.com.conf
sites-available/
??? bank.cwrcoding.com.conf
??? calendar.cwrcoding.com.conf
??? cloud.cwrcoding.com.conf
??? cwrcoding.com.conf
??? drive.cwrcoding.com.conf
??? groups.cwrcoding.com.conf
??? mail.cwrcoding.com.conf
??? sites.cwrcoding.com.conf
??? studentenverwaltung.cwrcoding.com.conf
??? wekan.cwrcoding.com.conf
??? www.cwrcoding.com.conf
Run Code Online (Sandbox Code Playgroud)

sites-enabled/* 文件每个都包含一行:

include sites-availabe/cwrcoding.com.conf;
Run Code Online (Sandbox Code Playgroud)

当尝试遍历启用了站点的/* 文件、剪切它们并尝试将它们的内容作为文件读取时,我遇到了一些奇怪的错误,所以我尝试了一个简约的工作解决方案,并从那里开始工作,但是以下发生:

? for enabled in sites-enabled/*
> do
> echo "$(cat "$enabled") |"
> echo ==========
> done
include sites-available/bank.cwrcoding.com.conf; |
==========
 |clude sites-available/calendar.cwrcoding.com.conf;
==========
 |clude sites-available/cloud.cwrcoding.com.conf;
==========
 |clude sites-available/cwrcoding.com.conf;
==========
 |clude sites-available/drive.cwrcoding.com.conf;
==========
 |clude sites-available/groups.cwrcoding.com.conf;
==========
 |clude sites-available/mail.cwrcoding.com.conf;
==========
 |clude sites-available/sites.cwrcoding.com.conf;
==========
 |clude sites-available/studentenverwaltung.cwrcoding.com.conf;
==========
include sites-available/wekan.cwrcoding.com.conf; |
==========
 |clude sites-available/www.cwrcoding.com.conf;
==========
Run Code Online (Sandbox Code Playgroud)

如您所见,对于大多数站点,cat输出的第一个字符被替换为命令替换之后的文本。

谁能解释发生了什么?还是我发现了一些错误?

如果你想看看这些文件:https : //github.com/cwrau/nginx-config

Joh*_*024 9

问题是您的文件具有 DOS/Windows 样式的行尾。作为快速解决方法,请替换:

echo "$(cat "$enabled") |"
Run Code Online (Sandbox Code Playgroud)

和:

echo "$(tr -d '\r' <"$enabled") |"
Run Code Online (Sandbox Code Playgroud)

这里,tr在文件显示前去掉回车符,避免了这个问题。

但是,如果您的文件打算在 Unix 系统上使用,您最好使用一种dos2unix或类似的实用程序从文件本身中删除回车符。

例子

让我们创建两个 DOS 风格的文件:

$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file1
$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file2
Run Code Online (Sandbox Code Playgroud)

让我们运行原始命令:

$ for enabled in sites-enabled/*; do echo "$(cat "$enabled") |"; echo ==========; done
 |clude sites-availabe/cwrcoding.com.conf;
==========
 |clude sites-availabe/cwrcoding.com.conf;
==========
Run Code Online (Sandbox Code Playgroud)

注意损坏的输出。

通过tr应用,我们会收到我们期望的输出:

$ for enabled in sites-enabled/*; do echo "$(tr -d '\r' <"$enabled") |"; echo ==========; done
include sites-availabe/cwrcoding.com.conf; |
==========
include sites-availabe/cwrcoding.com.conf; |
==========
Run Code Online (Sandbox Code Playgroud)

  • 查看`dos2unix`。 (2认同)