bash では、ヌル コマンドを何かにエイリアスできますか? つまり、ユーザーがシェル プロンプトでキーだけを押したことを認識できますか? たとえば、空のシェル エントリで画面をクリアする場合、 をコマンドにエイリアスするにはEnterどうすればよいでしょうか?Enterclear
答え1
空のコマンドを何かに(効果的に)エイリアスする方法は次のとおりです。
以下の内容を に入力します.bashrc
。
command1()
{
if [ "$BASH_COMMAND" != command2 ]
then
command_flag=1
fi
return 0
}
trap command1 debug
command2()
{
if [ ! "$command_flag" ]
then
echo "clear" # Put whatever command(s) you want here.
fi
command_flag=
}
PROMPT_COMMAND=command2
必要に応じて、およびcommand1
を、command2
ランダムに入力する可能性が低い単語に一貫して置き換えます。
trap command1 debug
command1
ユーザーがコマンドを入力するたびに関数が実行されます 。- 実行された最新のコマンドが でなかった場合は
command2
がcommand1
設定されますcommand_flag
。
- 実行された最新のコマンドが でなかった場合は
command2
に割り当てると、シェルがプロンプトを発行しようとするたびに が実行されるようPROMPT_COMMAND
になります。command2
command_flag
空白以外の値の場合は、command1
実行されたばかりであり、ユーザーがコマンドを実行したばかりであることを意味します。この場合は何も行いません。- もし
command_flag
そうならない空白以外の値がある場合、ユーザーは を押したことになりますEnter。この場合、必要な操作を実行します (例: 画面をクリアする)。 - どちらの場合も
command_flag
空白に設定すると、次のサイクルですべてが機能します。
注: これは bash 固有のものであることは間違いありません (つまり、POSIX ではサポートされていません)。
この回答は基本的に私の回答からコピーしたものですbash でコマンドの後に垂直スペースを追加する参照PROMPT_COMMAND の最後のコマンドが空であったかどうかを通知します。 他のアプローチについては。
答え2
TL;DR: は、Ctrl-l
文字を印刷したり Enter キーを押したりせずに画面をクリアします。これはおそらく、必要な機能に最も近いものでしょう。コマンドを各コマンドの前または後に実行したり、1 つの文字のエイリアスを作成したりできます。空の文字列をエイリアスにすることはできません。
エイリアスは、必ずしも 1 行にすべて入力されるように設計されているわけではありません。
alias ll='ls -l'
は良い例です。実行すれll /path/to/other/dir
ば結果を得ることができます。
エイリアスが行うことは、コマンドラインに入力された最初の単語を、指定した値に変更することだけです。
エイリアスが機能するための唯一の要件は、その後に非表示文字 (スペース/タブ/改行) が続く必要があることです。この場合、ll
自体は有効ですが、ll-/mypath/
別のコマンドの開始となる可能性のあるいくつかの文字をエイリアス化できる (そして頻繁に行われる) ため、有効ではありません (つまり、 はalias gi='git init'
のみを正確に解決できgi
、 は解決できませんgit
。これはほとんどの人が望み、期待していることです)。
空の文字列にエイリアスを付けることはできません。毎コマンドライン入力。
コマンドを毎回実行したい場合は、PS0
(bash の最新バージョンを前提としています) を使用して、各コマンドの前に何かを実行したり、PROMPT_COMMAND
各コマンドの後に何かを実行したりできます。例:
PROMPT_COMMAND='echo $?'
実行するコマンドごとに、実行したコマンドの戻り値がエコーされます。
Bash には、コマンド ラインに空の行を入力した場合にのみ、アクションを完了する適切な方法がありません。この点では、Bash は空白を区別しません。