私はUnixを初めて使用し、今日「Unixプログラミング環境」のコピーを購入しました。私は本からのものを試しています。しかし、それらのいくつかは次のように期待どおりに機能していません:行を削除して再入力するには、@文字を使用する必要があります:
本
$ ddtae@
date
Thu Nov 28 18:12:47 IST 2013
私の端末
$ ddtae@
ddtae@: command not found
別の例は、#を使用して最後の文字を消去することです
本
$ dd#att#e#e
日付として出てきて印刷します。
私の端末
$ dd#att#e#e
dd#att#e#e: command not found
私のシステムでは#コメントに使用されます
彼らはこれらのキャラクターがシステムに依存していると述べましたが。システムが上記の2つのタスクを実行するための文字を見つけるにはどうすればよいですか。
ターミナルライン制御は、stty
によって照会および/または設定できます。現在の設定を確認するには、stty -a
を使用します。マンページに詳細が記載されています。
たとえば、stty -a
から、次のキルラインコントロールが見つかります。
kill = ^U
キャレットとは、コントロールキーを押し続けることを意味します(Ctrl)次に、表示されている文字(U
)を入力します。ラインキルシーケンスを変更するには、次のようにします。
$ stty kill \@
注:バックスラッシュは、後続の文字がシェルによって文字通りに解釈されることを示すためのエスケープです。
ラインキルをこれに変更しました(文字通り @)、次のような行を消去できるようになりました。
$ ddtae@
注:上記のシナリオでは、入力すると ddtae、文字を入力すると @、行全体が消去されます。
デフォルト設定を復元する1つの方法(これは、誤って設定を変更した場合に非常に便利です)は、次のようにするだけです。
$ stty sane
stty
のさらに別の使用法は、文字のエコーバックを制御することです。たとえば、ユーザーが入力したときにユーザーのパスワードを非表示にする簡単な方法は、次のとおりです。
#!/bin/sh
echo "Enter password"
stty -echo
read PWORD
stty echo
echo "You entered '${PWORD}'"
@
と#
をラインエディションの文字として言及している本は、真剣に古くなっています。約40年前です。これらはUnixのごく初期の機能であり、まだ存在していますが、@
と#
は最新のシステムのデフォルト設定ではありません。代わりに、文字消去文字はバックスペースです(システムに応じて^h
または^?
として定義されます)。うまくいく、それは BackSpace キー送信)、行消去文字は^u
(Ctrl+U)。最近では、これらの設定を変更することは非常にまれです。 BackSpace OS、端末の種類、構成に応じて2つの異なる文字を送信できるためキー。
これらの文字は、 stty
コマンドで構成できます。たとえば、stty erase \# kill @
を使用して、旧式のUnix設定を設定できます。現在の設定はstty -a
で確認できます。他の多くの端末関連の設定を構成できます。失敗した場合は、stty sane
を実行して、使用可能な構成に戻します。別の端末からそれを行うことができます。 stty sane </dev/pts/42
を実行して、端末の構成を復元しますpts/42
(tty
を実行して、現在の端末の名前を確認します)。
Stty設定は、ターミナルが「クックドモード」にある場合にのみ適用されます。これは、ターミナルドライバーに組み込まれている非常に大雑把なコマンドラインエディターです。最新のシェルには独自のエディターがあり、ターミナルをrawモードに設定しているため、stty設定は適用されません。 Bash、csh、およびkshは、クックドモードエディションの文字をエミュレートしますが、tcsh、zsh、およびfishは、独自のキーバインディングに固執します。
探しているコマンドはシェルに依存しており、多くの場合、システム管理者とユーザーがカスタマイズすることもできます。
Bashは、Linuxで最も一般的なデフォルトシェルの1つです。 bashマニュアルが Readline Command Names と呼んでいるものとそれらのキーバインディングを探しているようです。
$ ddtae@
date
@
はbashのunix-line-discardとして意図されている可能性があります:CTRL + u
または代わりにbackward-kill-WordALT + Backspace
$ dd#att#e#e
上記の例では、#
は、通常Backspace
にマップされるRuboutにすることができます。