bashがコマンド置換のテキストを後のテキストに置き換えるのはなぜですか?

bashがコマンド置換のテキストを後のテキストに置き換えるのはなぜですか?

いくつかの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

site-enabled/* ファイルにはそれぞれ 1 行が含まれています。

include sites-availabe/cwrcoding.com.conf;

サイトの有効化/ *ファイルを繰り返し、そのファイルを切り取り、その内容をファイルとして読み取ろうとすると、奇妙なエラーが発生し、最小限の作業ソリューションを試してそこで作業しましたが、次はまだ発生します。

λ 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;
==========

ご覧のとおり、ほとんどのウェブサイトでは出力は、必要なテキストに置き換えられます。後ろにコマンドの置き換え。

何が起こっているのかを説明できる人はいますか?それともバグを発見したのでしょうか?

このファイルを表示するには:https://github.com/cwrau/nginx-config

ベストアンサー1

問題は、ファイルにDOS / Windowsスタイルの行末があることです。簡単な解決策として、次のものを交換してください。

echo "$(cat "$enabled") |"

そして:

echo "$(tr -d '\r' <"$enabled") |"

ここでは、trファイルを表示する前にキャリッジリターンを削除すると問題を回避できます。

dos2unixただし、ファイルがUnixシステムで使用されるように作成されている場合は、1つまたは類似のユーティリティを使用してファイル自体からキャリッジリターンを削除する方が良いかもしれません。

はい

2つのDOSスタイルファイルを作成しましょう。

$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file1
$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file2

元のコマンドを実行してみましょう。

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

破損した出力を確認してください。

を適用した後、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; |
==========

おすすめ記事