私のシェル環境の動作が変更されました。
以前は、次の関数定義を貼り付けたとき
function exampleFunc {
echo hello
}
シェルはフォーマットされているように見え、新しい関数定義を登録します。
>
これで、何らかの理由で最初の行を除くすべての行の前に表示されます。
function exampleFunc {
>echo hello
>}
forループを含む関数を今は登録できないことがわかりました。
これの説明は何ですか?以前のモードにどのように戻すことができますか?
Ubuntu 20.04
この変更はインストール後に発生しました。ヌッシャーしかし、関係がないかもしれません。
答え1
これはインストールとは関係ありませんnushell
。また、シェルが正しく機能するのを妨げることはありません。
これは>
シェルのデフォルトです2番目の通知(PS2
)。ユーザーがEnter現在のコマンドを完了せずにキーを押した後、シェルで追加の入力が必要なときはいつでもセカンダリプロンプトが表示されます。これは、シェルが対話型モードの場合にのみ発生します。
POSIX規格これについて教えてくださいPS2
:
ユーザーが
<newline>
インタラクティブシェルでbeforeと入力してコマンドラインを完了するたびに、この変数の値をパラメータ拡張して標準エラーに書き込む必要があります。デフォルト値はです>
。
特定の例では、関数定義はまだ完了する必要があるコマンドです。シェルは、ユーザーが}
定義の最後に閉じる中括弧を入力するまでコマンドを実行することはできません。
次の場合、2番目のメッセージも受信されます。生地bash
Readlineライブラリの「角かっこ貼り付け」が無効になっている場合は、シェルコマンドで。デフォルトでは、角かっこ貼り付けモードが有効になっています。これは、シェルが個々の行ではなく貼り付けたテキストブロックをすべて一度に処理することを意味します。ファイルに次の行を追加すると、~/.inpturc
この動作を無効にできます(将来のシェルセッションで)。
set enable-bracketed-paste off
端末が「愚か」または5.0より前のbashシェルバージョンを使用している場合は、角かっこ貼り付けモードもデフォルトで無効になります。
シェルごとに異なるデフォルト値があります$PS2
。たとえば、シェルはzsh
プロンプトを動的に更新し、現在処理されていないコマンドを通知します。
$ function foo {
function> for arg do
function for> print -r $arg
function for> done
function> }
$ foo 1 2 3
1
2
3
...bash
シェルが静的>
文字列を使用している間:
$ function foo {
> for arg do
> printf '%s\n' "$arg"
> done
> }
$ foo a b c
a
b
c
このシェルは、POSIXファミリーシェルの補助プロンプトと同じようにnushell
見えます。:::
ただし、このnushell
シェルはPOSIXシェルになりようとしません。
PS2
変数を設定しないと、bash
混乱が発生する可能性があります。たとえば、私は長期実行コマンドを呼び出したと思いましたが、実際には閉じる引用符を忘れた場合、シェルはコマンドが完了するのを待っているという指示はありません。
答え2
>
これはボーンシェル変数と言う補助プロンプト文字列。
gnu.orgから:
Bash は Bourne シェルと同じ方法で特定のシェル変数を使用します。場合によっては、Bashは変数にデフォルト値を割り当てます。
補助プロンプト文字列、PS2
補助プロンプト文字列。デフォルトは「>」です。
PS2
表示する前にはPS1と同様に拡張されます。
以下を使用して抑制できます。
unset PS2
からインスピレーションを受けるhttps://superuser.com/a/1499801/217142
>
私のシェルがセカンダリプロンプト文字列を導入する理由を理解できません。しかし、Kusalalanandaが言ったように、私が経験している問題はこれ(またはnushellのインストール)とは関係ありません。代わりに、私が言及した機能しないforループは、私がコピーしたエディタに誤ってタブをインポートしたために発生しました。これはbashを引き起こします。割り込み機能の定義メッセージがありますdisplay all X possibilities
。
エラーを再現するには、以下を公開する必要があります。
function exampleFunc {
echo hello;
}
参考にしてください\s\t\t
(スペースタブタブ)前方echo
。問題を単純化したとき、その理由がわかりませんでした。痛みを伴う教訓!