ターミナルをクリアするが、コマンドで現在の行を保存する必要がある。スクリプト内!(スクリプトはコマンドによって呼び出されます。スクリプトを呼び出すこのコマンドの前にターミナル全体をクリアする必要があります。)履歴からコマンドを復元することは適切ではありません
想定される使用例:
- スクリプト「test.sh」を作成しています
- これに、修正した「クリア」コマンドをいくつか書き込みます。
#!/usr/bin/env bash clear echo some text
- 適用する
現在のターミナル状態:
'test.sh' を実行した後の現在の結果:
何が問題なのでしょうか?コマンドの行が消えてしまったこと+vscodeではスクリプトエラーコードで左のチェックマークが表示されません。
期待される結果:
どうやってするの?
追伸:
問題はvscodeだけではなく、他の端末でもコマンドが完全に消去されます
答え1
一方通行
実際のプロンプトが必要な場合は、次のようなカーソル操作を使用できます。
#!/bin/bash
# Save cursor position
printf '\033[s'
# Move the cursor up 1 line
printf '\033[1A'
# Clear the screen
printf '\033[1J'
# Restore cursor position
printf '\033[u'
echo "new thing"
上記の例をさらに調整する必要がある場合は、例えば以下を参照してください。ANSI エスケープ シーケンス:カーソルの移動そしてまたANSI エスケープ シーケンスそれらの詳細については。
別の方法
clear
必要に応じて引き続き使用し、その後次のようにプロンプトを再描画することもできます。
#!/bin/bash
# Clear the screen
clear
# Build the prompt as it was before "clear"
line="$(printf '%s' "$USER@$HOSTNAME:$PWD$ $0")"
# For "root" prompt i.e. "#", comment out the above line and uncomment the below line
# line="$(printf '%s' "$USER@$HOSTNAME:$PWD# $0")"
# Print the prompt
echo "${line/\/home\/$USER/\~}"
echo "new thing"
あるいは、このようにもできます:
#!/bin/bash
clear
line="$USER@$HOSTNAME:$PWD$ "
read -t 0.01 -ei "$(echo "$0")" -p "${line/\/home\/$USER/\~}"
echo
echo "new thing"
見た目は人を騙すものですが、見た目こそがあなたが望むものかもしれません...ただし、これは本当のプロンプトではありません。
答え2
あなたの質問はそれほど重要ではありませんがclear
(皮肉なことに、あなたが使用したいコマンドはそれです)、とにかく答えてみます。
私の理解では、コマンド ( と呼ぶことにします./myscript
) を使用してスクリプトを呼び出し、スクリプトが実行される前に画面をクリアしたいということですね。
これには 2 つの方法があります。
画面をクリアしてからスクリプトを実行します。
$ clear; ./myscript
clear
スクリプトの最初の行に次のコマンドを入力します。#!/bin/bash # Beginning of ./myscript clear # The rest of the script goes here
次にスクリプトを実行して画面をクリアし、他の処理に進みます。
$ ./myscript
最後に、画面をクリアしてから最後のコマンドを再実行するエイリアスを作成する場合は、次のように定義できます。
alias clrun='clear; $(fc -ln -1)'
実行するとclrun
、画面をクリアしてから前のコマンドを再実行します。
これで質問の答えが見つからない場合は、何を求めているかをもっと正確に伝える必要があります。