nanoを使用して保存するとシェルスクリプトは機能しますが、Notepad ++を使用して保存すると機能しません。

nanoを使用して保存するとシェルスクリプトは機能しますが、Notepad ++を使用して保存すると機能しません。

Notepad ++のbashスクリプトをSSH内のNanoエディタの新しいファイルにコピーして保存します。うまくいきます。 (sh ./install).

ただし、ファイル(まったく同じ内容)を保存すると、私のWebサーバーにアップロードし、同じコンピュータからWgetを使用してダウンロードします。構文エラーが発生します。エンコーディングを確認してみると同じようです。それ以来、私は問題が解決することを確認するためにいくつかの文字エンコーディングで遊んでいます。 wgetを使用してファイルをダウンロードした後、ファイルを実行可能にしました!

ファイルが正常に実行され、nanoを使用してコピーして貼り付けてもエラーは発生しません。これは何か知っていますか?

答え1

私は問題が行末に関連していると確信しています。おそらくどこかで*nixではなくマシンを使用しているでしょう。さらに、アップロードされたテキストファイルにWindowsスタイルの行末を追加するという問題(Linuxで実行)が発生し、同様の内容を見ることapacheができます。

テストするには、ダウンロードしたファイルをインポートしてに渡しますod。ファイルが長い場合は、最初の数行だけインポートしてください。

head script.sh | od -c

出力を見て、次のようなものがあることを確認してください。

f   o   o  \r  \n

これはキャリッジリターンで、Windows行では* nixとは異なります\r。これが実際に問題であることが判明したら、キャリッジリターンを削除してファイルを修正できます。\r\n\n

sed -i 's/\r//g' script.sh

答え2

@graemeが注意深く指摘したように、サーバーには2つの形式のスクリプトがあるため、diff作業バージョンと問題のあるバージョンの違いを確認するために簡単な作業を実行できます。

$ diff working.sh broken.sh

次のように並べて比較することもできます。

$ diff -y working.sh broken.sh

ある種のタイプミスのためにスクリプトが機能しない場合は、通常スイッチを追加して-xこれらのエラーを検出することができます。bashこれによりスクリプトが冗長になります。

$ bash -x broken.sh

#!/bin/bash次のように、スクリプトの上部の shebang( ) にこのスイッチを組み込むこともできます。

#!/bin/bash -x

行末

これは、WindowsからUnix / Linuxシステムにファイルを移動するときにしばしば問題になります。問題は、両方のプラットフォームで行末がどのように表示されるかに関するものです。これについての詳細はウィキペディアのタイトルの下で読むことができます。改行文字

サンプルファイルの作成

$ echo -e "This is a file.\nThat I made on Unix.\n" > unixfile.txt

@terdonが彼の答えで説明したように、これを使用してsedそれらを削除することができますdos2unix。次の 2 つの方法のいずれかで使用できます。

$ dos2unix unixfile.txt

または、既存のファイルを上書きしたくない場合:

$ dos2unix -n oldfile.txt newfile.txt

上記の上記を使用すると、2つのファイルをdiff比較すると、次の出力が表示されます。

$ diff -y unixfile.txt winfile.txt 
This is a couple                            |   This is a couple
of lines of sample                          |   of lines of sample
text.                                       |   text.

それらがあるということ以外は違いを知ることはできません。 @terdonの答えは、トラブルシューティングのアプローチを再び示していますod。もちろん、何が起こっているのかを把握するために使用できる方法はいくつかあります。

vimを使う

cmdへfile

$ file unixfile.txt
winfile.txt: ASCII text 

$ file winfile.txt 
unixfile.txt: ASCII text, with CRLF line terminators

上記で強調された問題は、WindowsのファイルにCRLF(別名:行末のキャリッジリターン+改行文字)があることです。この文字は16進数0x0Dと0x0Aです。もう一度参照してください。改行に関するウィキペディア記事もっと知りたいなら。

vim以下を使用して問題を表示することもできます。

$ vim winfile.txt

vim以下は、問題の表示方法を示す小さな順序です。 CRLF文字は通常Unixでは+^Mと表示されます。CtrlM

                                       vim SS

シーケンスは、ファイルをwinfile.txtフォーマットされたUnixファイル(:e ++ff=unix)で再開する方法を示しています。これはvim、ファイルがWindowsに適した形式であるかどうかを自動的に検出しないように指示するため、行終了^M文字が表示されます。

関連情報