echoを使用して標準出力を上書きする方法は? [閉鎖]

echoを使用して標準出力を上書きする方法は? [閉鎖]

我々は再定義する方法を知っており、bar.txt次のものを使用できます。

echo "foo" > bar.txt

しかし、標準出力をどのように上書きしますか?私は次のコマンドを試しました。

echo "foo" >

しかし、それは失敗しました。次のようなものを印刷したいので、これが欲しいです。

Hello  

world

I'm 

HERE 

一度に1単語ずつ前の単語を削除したい(標準出力では一度に1単語ずつ)。

答え1

echo常に標準出力1に出力します。echo foo常に1つを作成してくださいwrite(1, "foo\n")

これにより、echo foo > fileシェルはechoコマンドの標準出力を新しいfileファイルに変更します。echo fooそれからまだaを実行しますwrite(1, "foo\n")が、今回はstdout(ファイル記述子1)がfileシェルから継承したstdoutの代わりにポイントします。

stdoutを必要とせずにstdoutに書きたい場合リダイレクト、書く:

echo foo

stdoutが指すリソースを各echo

Linux(およびLinuxのみ)では、次のことができます。

echo foo > /dev/fd/1
echo bar > /dev/fd/1
# now the file stdout points to (if it's a regular file) contains "bar"

Linuxでは、/dev/fd/1stdoutで開かれたファイルへのシンボリックリンクです。したがって、再度開くと>ファイルが切り捨てられます(他のUniceではこのように> /dev/fd/nファイルdup2(n,1)は切り捨てられません)。標準出力がソケットに接続されていると動作しません。

それ以外の場合は、ftruncate()stdout(fd 1)を呼び出して切り取ることができます。

perl -e 'truncate STDOUT,0'
echo foo
perl -e 'truncate STDOUT,0'
echo bar

代わりにこんな言葉が欲しいなら、stdoutが端末の場合画面上で互いにオーバーレイするには、端末制御文字を使用してカーソル位置に影響を与えることができます。

 printf %s FOO
 printf '\r%s' BAR

BARはFOOよりも優先されます。 FOOは、\r端末にカーソルを行の先頭に移動させるように指示する制御文字であるからである。

これにより:

printf %s FOOBAR
printf '\r%s' BAZ

しかし、BAZBAR画面では見ることができます。ラインをクリアするには、他の制御シーケンスを使用する必要があるかもしれません。キャリッジリターンは普遍的ですが、\r画面を消去する制御の順序は端末によって異なります。最良の方法は、terminfoデータベースを照会してtput検索することです。

clr_eol=$(tput el)
printf %s FOOBAR
printf '\r%s%s' "$clr_eol" BAZ

1 KornまたはZシェルを使用している場合は、他のファイル記述子への書き込みをサポートする別の出力コマンドはprintprint -u2 FOOのとおりFOOですprintechoBourneのようなシェルを使用してecho >&2 FOO同じ結果を得ることができます。echo私はまだ標準出力に書き込んでいますが、シェルリダイレクト>&2演算子を使用して標準出力をシェルのstderrにコピーしました。

答え2

あなたは言うことができます、

$clear && printf "before" && sleep 1 && clear && printf "after\n"

あなたの世界のために、

$clear && printf "Hello" && sleep 1 && clear && printf "World" && sleep 1 && clear && printf "I'm" && sleep 1 && clear && printf "Here\n"

答え3

とにかく端末に印刷する場合は、改行文字(-n)を省略して明示的なキャリッジリターンを使用できます。

echo -en 'hello, dear\r'; sleep 5; echo -en 'world\r'; echo

(文字列を完全に覆うには、文字列を空白で埋める必要があります。)

答え4

echoSuchhiのソリューションの代替案を使用するには、このコマンドのオプションをprintf確認してください。これにより、バックスペースキーを含む特定のエスケープシーケンスを使用できます。改行を抑制するオプションとともに、次のことができます。-eecho\b-n

 echo -n "Hello" && sleep 10 && echo -n -e "\b\b\b\b\bworld"

関連情報