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