シェルスクリプトの最後の行に改行文字がありません。

シェルスクリプトの最後の行に改行文字がありません。

uptimeファイルの末尾に改行文字がなくても、シェルスクリプト(下)の最後のコマンドラインが正常に実行されるのはなぜですか?

たとえば、

root@jcdb:/tmp# 
root@jcdb:/tmp# 
root@jcdb:/tmp# cat dp
date
pwd
uptimeroot@jcdb:/tmp# 
root@jcdb:/tmp# 
root@jcdb:/tmp# 
root@jcdb:/tmp# ./dp
Wed Jun  6 16:27:26 EAT 2018
/tmp
  4:27pm  up 1 day, 17:25,  2 users,  load average: 0.39, 0.40, 0.41
root@jcdb:/tmp# 
root@jcdb:/tmp#

答え1

シェルがシェルスクリプトを読み取ると、スキャンコードは終了改行文字がなくてもスクリプトの最後にある最後の単語を受け入れます。

これが効果ですシェルが入力でトークンを認識する方法に関するPOSIX標準の最初の規則:

入力端が認識されたら、現在トークン(存在する場合)を区別する必要があります。

実際、現在のトークンはここで区切られていると言います。これは、スクリプトの最後の単語と終了しない行の残りの部分がエラーを引き起こしたり、シェルをコードに入れたりする代わりに、インタプリタへの入力として許可されることを意味します。探索されていない定義された状態。


コメントには編集者が引用されていますvi。標準viエディタは、最後の行が改行文字で終わらないファイルを編集できます。ただし、バッファをファイルに書き込むと、バッファの最後の行は改行文字で終了します(空のファイルを保存するときに改行が明示的に許可されていない場合を除く)。標準エディタでも同様ですex

入力ファイル

入力ファイルは、テキストファイルでなければならず、{LINE_MAX}-1バイトより長くなくNUL文字を含まない最後の最後の行を除いてテキストファイルでなければなりません。デフォルトでは、不完全な最後の行は末尾として扱われます<newline>。実装では、ファイルの他の形式を編集することを選択できますex

エディタには、終了していない最後の行を保持するかどうかを決定するvim設定があります。eolデフォルトの動作は最後の行を終了することです。で確認:help eol済みvim

標準エディタの入力はedテキストファイルでなければなりません。つまり、最後の行が正しく終わっていないファイルを編集する場合(テキストファイルでない場合)、技術的に指定されていないことを意味します。 OpenBSDでは、ed終了していないテキストファイルを開くと、エディタに「新しい行を追加」と表示されます。

入力ファイル

入力ファイルはテキストファイルでなければなりません。

関連情報