Bashコマンドラインに複数行コマンドを入力する方法

Bashコマンドラインに複数行コマンドを入力する方法

私はスクリプトの問題を解決していますが、各行を手動で入力して1行ずつエラーを見つけたいと思います。

私のスクリプトにはif文があります。

if [ -d dir1 ]; then
    rm -rf dir1
fi

それでコマンドラインを入力してみました。

$ if [ -d dir1 ]; then rm -rf dir1 fi
> 

Ctrl-Dを試しましたが、次のメッセージを受け取りました:bash:構文エラー:予期しないファイルの終わり

それでは、コマンドラインにこのifステートメントをどのように入力しますか?

答え1

短い答え:その後にはセミコロンが必要ですrm -rf dir1

実際のケースを見る:ifスクリプトに示されているようにブロックを正確に入力してください。

$ if [ -d dir1 ]; then
>     rm -rf dir1
> fi

実行後、上矢印を使用して最後のコマンドを再度呼び出すと、ブロック全体が1行ifに表示されます。

$ if [ -d dir1 ]; then rm -rf dir1; fi

シェルには、ifブロック内のコマンド間の中断を記述する方法が必要です。単に一度に実行される単一のコマンドでは処理できないため、セミコロンはそれを区別する役割を果たします。

答え2

Johnの答えは完全に正確ですが、まだ(非常に長い)1行のコマンドを入力するという事実に加えて、複数行のコマンドを入力する実用的な方法があります。

$ if [ -d dir1 ]; then
>         rm -rf dir1
> fi

それは…ただ入ってください。入力されると、シェルはコマンドがまだ完了していないことを認識し、「続行プロンプト」を提供します。

しかし、コマンドならはい実際に完了しましたか?それとも依存したくないですか?また、可能性があります。

VLNEXTと言って普通に設定されているのに^V、使いたいなら本物もちろんstty -a、出力をチェックしてccharsグループを見てくださいlnext(BSDでは、GNU sttyはかなりソートされていませんが、私は3行目です)。

追加の合併症として料理モードでEnterを押して送信^M(ASCII 0x0D)しますが、実際にはASCII 0x0Aが必要なので、^JVLNEXTを押す必要があります。

その後、それを入力すると、1つのif [ -d dir1 ]; then^V^Jrm -rf dir1^V^JfiEnter大きなコマンドで実行されます。 GNUでは、次のように見えます。

$ if [ -d dir1 ]; then
rm -rf dir1
fi

...そしてView Historyを押すと、実際にはセミコロンを含む1行のテーブルが保存されます。

他のシェルは異なるレンダリングが可能です。例えば、入力するとこんな内容が出ます...

$ if [ -d dir1 ]; then^Jrm -rf dir1^Jfi

...押すと歴史的に保存されていることがわかります。数回押すと、2文字(カラット)とでは^Jなく、実際には制御文字であるため、単一文字として扱われることがわかります。^J

したがって、GNU bashはより良い入力を持ちますが内部的に変換しますが、mkshは単一行の入力(およびコマンドライン編集)を持ちますが、入力したとおりに正確に履歴に保持します。

存在する入力すると、複数行のbashのように見えます。

% if [ -d dir1 ]; then
rm -rf dir1
fi

...これも履歴に保存されます(mkshと同様に、zshには複数行の入力編集機能があるため、カーソルを行の上下に動かして^J実際の改行に拡張できます。これには欠点がありますが^U、ではなく、その中にあるサブラインだけが終了します。

1999年のように振る舞うmkshと同じように1行を取ります^Jが、各行を別々に履歴に保存するので、取得できるのは最後の行だけですfi。これは非常に役に立ちません。

最新 (Debian Stable/Bullseye)ここでの動作はmkshに似ています。

ヒュンダイAT&T ksh93「u+m」ははるかに奇妙です。入力するとpdksh/mksh系譜のいとこのように動作するが、押すと(のみ)最初コマンドライン(pdkshのような最後の行ではない)もあまり役に立ちません。

それは…変です。インライン^V^Jで表示されるため^M(そうでなければmkshのように動作し、もちろんPOSIX互換シェルではないため、ifコマンドは構文エラーで失敗します)、どちらの場合^V^M^VEnterEnterキーを押すのと同じように動作します。

> if [ -d dir1 ]; then^Mrm -rf dir1^Mfi
if: Expression Syntax.
rm: Command not found.

最後に、オリジナル

% if [ -d dir1 ]; then^Jrm -rf dir1^Jfi
if: Expression Syntax.

…驚くこともない。履歴を検索するインタラクティブな方法がなく、保存された行historyを表示するコマンドを実行しても出力(単純な出力でもls)が提供されないため、いくつかの設定を有効にする必要があると思います(使用したことはありません)Cシェル)。

完全な公開:私はmksh開発者です。

答え3

これはシェルによって異なりますが、現在編集中の行を編集できるメインエディタに入れてから保存して終了する方法があります。これが完了すると、それに応じてコマンドラインのコマンドが更新され、Enterキーを押してコマンドを実行できます。

存在する強く打つ希望のキー入力は次のとおりですCtrlxCtrle(2つのキーコード、次のキーコードの後に​​入力)

EDITOR環境変数が目的のエディタに設定されていることを確認してください。

関連情報