@jdt さん、回答ありがとうございます。
それに続いて、キャリッジリターンでこの問題を抱え続けているので、その小さなスクリプトを書きました。 carriage_return
のみを実行 ファイルを「クリーニング」するよう求められます。
https://gist.github.com/kartonnade/44e9842ed15cf21a3700
alias carriage_return=remove_carriage_return
remove_carriage_return(){
# cygwin throws error like :
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile
read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'
# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean
# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean
eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file
eval 'rm '$temp_file_to_clean
}
ファイルのエンコードの問題である可能性があります。
異なるオペレーティング システムやエディター間でファイルを操作しているときに、ファイル タイプのエンコーディングの問題に遭遇しました。私の場合は、特に Linux と Windows システムの間で発生しました。
ファイルのエンコーディングをチェックして、対象の Linux 環境に適していることを確認することをお勧めします。 MAC を使用している場合は、Windows テキスト エディターを使用した場合よりもエンコーディングの問題が発生する可能性は低いと思いますが、ファイル エンコーディングは検討する価値があると思います。
--- 編集 (@Potatoswatter が推奨する実際のソリューションを追加)
ファイル タイプのエンコーディングがどのように問題になるかを示すために、サンプル スクリプトをコピーして Windows のメモ帳に貼り付け (Mac にはアクセスできません)、Linux マシンにコピーして実行しました:
[email protected]:~/windows> sh ./originalfile
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {
この場合、メモ帳は改行と改行を含むファイルを保存したため、上記のエラーが発生しました。 \r
改行を示します (Linux システムでは改行 \n
で行を終了します それだけ)。
Linux マシンでは、次のコマンドを実行してファイルからキャリッジ リターンを削除することで、この理論をテストできます (存在する場合)。
cat originalfile | tr -d "\r" > newfile
次に、新しいファイル sh ./newfile
を実行してみてください .これが機能する場合、問題は隠し文字としての改行でした。
注: これはあなたの環境を正確に再現したものではありません (私は Mac にアクセスできません) が、エディターがどこかでキャリッジ リターンをファイルに保存したことが問題であると思われます。
--- /編集
少し詳しく説明すると、オペレーティング システムとエディタではファイル エンコーディングのデフォルトが異なる場合があります。通常、アプリケーションとエディターは、使用されるファイルタイプのエンコーディングに影響を与えます。たとえば、Microsoft Notepad と Notepad++ のデフォルトは Windows-1252 だと思います。考慮すべき改行の違いもあります (Windows 環境では、ファイル内の行を終了するためにキャリッジ リターンとラインフィードがよく使用されますが、Linux と OSX では通常、ラインフィードのみが使用されます)。
ファイル エンコーディングを参照する同様の質問と回答はこちら:bash スクリプトの実行で不正な文字が表示される
のようなものを試してください
$ sudo apt-get install dos2unix
$ dos2unix offendingfile
example.sh
を変換する簡単な方法 ファイルを UNIX
に Windows で作業している場合は、NotePad++ を使用する必要があります ([編集]> [EOL 変換]> [UNIX/OSX 形式])
notepad++ でデフォルトの EOL を設定することもできます ([設定]> [環境設定]> [新しいドキュメント/デフォルト ディレクトリ]> [フォーマット] ボックスで [Unix/OSX] を選択)