一重引用符を入力すると、端末はどのモードになりますか?


11

'ターミナルで一重引用符を入力すると、他のモードに移行し、コマンドは実行されません。このモードとは何ですか、いつ使用しますか?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
そして、なぜあなたはルートとして実行していますか?
ザンナ

13
端末は以前と同じモードです- シェルは異なるモードです(別の文字列との文字列の完了を待っています'
大野

回答:


26

事実上、シェルは完全なコマンド/式を要求し、そのために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-などを含むシェル、に固有のものでbashdash(Ubuntuの上でそれがシンボリックリンクされている/bin/sh)、kshmkshcshそして、その派生物はそのような方法で動作しません:

$ 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?がオフライン/間違っています。
ティコ

@Ticoありがとう。答えは、1秒あたりのミリカメのインターネット速度で書かれており、リンクの一部しかコピーされませんでした。現在修正済み
セルギーコロディアズニー

3
一方、zshは、何を待っているかを実際に伝えるのに十分なほど親切です。これは、コマンドは有効であるが何かをエスケープするのを忘れた場合に役立つことがあります。
ケビン

30

シェルは閉じ引用を待っています。入力すると、通常の動作を正確に実行し、入力したコマンドの実行を試みます。

引用符は、シェルが特殊文字を解釈しないようにします。つまり、展開は実行されません。単一引用符は、特殊文字のすべての解釈を完全に抑制します。通常、改行はコマンドを区切りますが、ここでは改行を引用してコマンドの一部として含めています。

などのコマンド<newline>ls<newline>がないため、見つかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.