「ls引用符」とは何ですか?

「ls引用符」とは何ですか?

今日は偶然押しましたが、'命令ls
ls'

> ls'
quote> ls'
zsh: command not found: ls\nls
>

何が起こったのか教えてくれる人はいますかls quote

答え1

引用符を開いて'Enterを押したため、シェルは引用符を閉じると予想します。このquote>ヒントは、このタイプを視覚的に表示したものにすぎません。

これにより、プログラムに複数行の引数を渡すことができます。

たとえば、

$ echo 'hi
quote> there'

hi
there

と入力したため、これは存在しないコマンド(途中で改行されたコマンド)をls'Enterls'Enter実行しようとするのと同じで、シェルでエラーが発生します。ls\nls

答え2

これは(別名)プロンプト、セカンダリプロンプト文字列quote>です。$PS2$PROMPT2zsh

あなたの場合、デフォルトのプロンプト文字列($PS1/ $PROMPT)はコマンドを入力するように招待する文字列のようです。 2番目のコマンドは、コマンドを継続して完了するように招待するコマンドです。

コマンドを押しEnterたがまだ完了していないときに表示されます。

zshのデフォルト値はで、ここでは(で説明されています)。$PS2%_> %_プロンプト拡張/シェル状態):

%_

パーサーの状態、つまりコマンドラインから始まるシェル構成(たとえば、ifおよび)。for整数が与えられると、多くの文字列が印刷されます。ゼロまたは負の数または整数がない場合は、できるだけ多くの値を印刷することを意味します。これは、連続した行をプロンプトし、PS2オプションを使用してPS4デバッグするときに最も便利ですXTRACE。後者の場合、非対話式でも機能します。

たとえば、次のように入力すると:

my-PS1-prompt> (while true; do for i in "${var-qwe
subsh while for dquote braceparam>

シェルは、コマンドが完了し、シェルが実行を開始する前に、中括弧パラメータ${...}拡張、"..."二重引用符をオフにして、forステートメントを完成させ、サブシェルを閉じる必要があることを知らせます。while

あなたの場合、一重引用符で囲まれた文字列を閉じる必要があるというメッセージが表示されます'...'。これはそのコマンドを実行しようとしますが、ls<newline>lsシステムにコマンドがないため失敗します。

、(一部の端末では+を入力することもできます)、または+、+をEnter押すことなく、現在の行の代わりに編集バッファにリテラル改行(別名)を入力できます。シェルに提出してください。この場合、セカンダリプロンプトは表示されず、カーソルを最初の行に戻すことができます。EscapeEnterAltEnterCtrlVCtrlJ^J

$PS1また、(aka)forステートメント、(aka)デバッグ出力が$PS2あり、()と()は画面の右側に印刷されることを除いて/に似ています。$PS3$PROMPT3select$PS4$PROMPT4xtrace$RPS1$RPROMP$RPS2$RPOMPT2$PS1$PS2

$PS1,2,3,4Kornシェルでは、%x特殊シーケンスはcsh(by zsh)から来ます。 POSIX は、以下以外を指定します。PS3ksh( の文を指定しないためselect) ただし、%xシーケンスは指定されません。

tcshでインスピレーションを$prompt受けた/ 。$rpromptzsh$RPS1$PRS2

シェルは/の文字とは反対であり、異なる互換性のない文字を使用して、特殊シーケンスのプロンプトbashから別の(そして不幸な)構文を選択します。具体的です。$PSx\%tcshzsh%_zsh

関連情報