回答:
事実上、シェルは完全なコマンド/式を要求し、そのためにPS2
プロンプト文字列を表示しています。
からman bash
:
催促
インタラクティブに実行する場合、bashはコマンドを読み取る準備ができたらプライマリプロンプトPS1を表示 し、コマンドを完了するためにさらに入力が必要な場合はセカンダリプロンプトPS2を表示します。
そしてその少し前:
PS2 The value of this parameter is expanded as with PS1 and used as the secondary prompt string. The default is ``> ''.
したがって、ドキュメントを読むとわかるように、シェルには目的の異なる複数のプロンプトがあります。PS1
プロンプトは、あなたですroot@sai:~#
あなたがコマンドを入力すると正常に表示さ文字列、。>
あるPS2
プロンプト。他の人があまりにも、あります:PS3
用のselect
コマンドブロックとPS4
してデバッグするためset -x
のコマンド。この場合、より興味がありPS2
ます。
シェルがPS2
プロンプトを表示する方法(および新しい行でコマンドを完了する必要がある場合)には多くの方法があります。here-doc
リダイレクトを実行するときに同じプロンプトが使用されます(この例では、終了文字列が表示されたときにコマンドが完了したと見なされますEOF
)。
$ cat <<EOF
> line one
> line two
> EOF
line one
line two
非常に多くの場合、長いコマンドの継続は、\
改行(!)を追加することで実行できます。これにより、同じプロンプトが表示されます。
$ echo Hello\
> World
HelloWorld
$ echo 'Hello\
> World'
Hello\
World
パイプライン、論理演算子、または特別なキーワードがコマンドラインで改行の前に表示される場合、コマンドはすべての最終ステートメントが入力されるまで不完全と見なされます。
$ echo Hello World |
> wc -l
1
$ echo Hello World &&
> echo "!"
Hello World
!
$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3
$ if [ -f /etc/passwd ]
> then
> echo "YES"
> fi
YES
特定のケースでは、単一引用符は、単一引用符の間にあるもののリテラル解釈を意味します。したがって、Zannaが指摘したように、newline + ls
+ newline で構成されるコマンドを入力しています。このような実行可能ファイル名は見つかりません(通常、コマンドファイル名は英数字、アンダースコア、ダッシュ、ドットのみで構成されている必要があります)。実際、特殊文字を含むファイル名を使用することは可能ですが、常に回避されます。
注:あなたの例に示すように、このような行動は、Bourne-などを含むシェル、に固有のものでbash
、dash
(Ubuntuの上でそれがシンボリックリンクされている/bin/sh
)、ksh
とmksh
。csh
そして、その派生物はそのような方法で動作しません:
$ tcsh
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%
ただし、対話モードでcsh
は、さらに入力が必要な場合はprompt2?
として発生します:
$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3
What's the difference between <<, <<< and < < in bash?
がオフライン/間違っています。