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
问题是您的文件具有 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)