`\r`を空白文字として扱うシェル

`\r`を空白文字として扱うシェル

プライベートプロジェクトとして、Cygwinで実行されているWindows 10に付属のいくつかの外部ファイルをクリーンアップするスクリプトを作成しようとしています。私はスクリプトがコピーして貼り付けることができるようにしたいです。これには、さまざまな種類の改行に対する耐性が必要です。特定のオプションを設定するときにshスペースをスペースとして扱う機能を提供する同様のシェルはありますか?\r

これは奇妙なことです。答えは、おそらく「はい、奇妙なことであり、どうするかはありません」として帰結します。

答え1

通常、これは実際のスクリプトでは不可能です。

  1. スタンドアロン実行スクリプトには、使用するインタプリタを識別するshebang行があります。

    #!/bin/sh
    

    問題は翻訳に関係なく、シャーボンライン自体先端の前にキャリッジリターンが含まれています。これはインタプリタが見つからないことを意味します(文字通り実行可能性の低い実行可能ファイル名は除外$'sh\r'- Windowsでは違法だと思います)。

  2. 実行可能なスクリプトの別のタイプは、実行ビットが設定されたプレーンテキストファイルです。POSIXは、POSIXシェルコマンド言語のスクリプトとして解釈する必要があります。(互換性のあるシェル自体から呼び出される場合)しかし、発見したように、このシェル言語はキャリッジリターンをデータバイトとして扱うので、識別された問題があります。


あなたはいくつかの選択肢があります。 1つは、単に実際に実行可能なスクリプトを放棄し、他の言語のインタプリタを最初に呼び出すことです。あなたはPerlとPythonをチェックし、実際にはほとんどのスクリプト言語は現代的な行末形式に満足しています。スクリプトをperl cleanup.pl

しかし、多くの管理作業は従来のシェル言語ではるかに簡単で、ここにコツがあります。各行をコメントで終わります。

echo hello #
rm file.ext #
mv /path/other.fl /path/bin #

この#役割は、すべての標準シェル(非対話型コンテキストで)の行末にコメントを追加します。コメントには、コメントに適した要素であるキャリッジリターンバイトが含まれ、すぐに終了改行バイトで終わります。

ハッシュ値の前にスペースが必要であることが重要です。#一言で言ういいえコメントを始めましたが、単語の一部です。

シェルを使用してこのスクリプトを直接実行できます。

bash cleanup.sh
dash cleanup.sh
sh cleanup.sh

ただし、既存のシェルセッションでコマンドを入力して実行すると、前述のPOSIXスクリプトも機能します。ファイルを実行可能にしてから

./cleanup.sh

使用して実行します。シェルが考えているものは何でも、POSIXスクリプトを使用するのは正しいです。

ワンタイムのように聞こえるので、実行可能にしようとする価値がないので、sh cleanup.sh私にとっては十分です。


この状況に対する私の率直な提案は、おそらくPowershell(または一括プッシュ)です。しかし、私はそれがあなたが望むものではないことを知っています。 WSLは別のオプションです。 WSLはshebang行からキャリッジリターンを自動的に処理し、コメントを使用して残りの操作を実行できます。

関連情報