我々は再定義する方法を知っており、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/1
stdoutで開かれたファイルへのシンボリックリンクです。したがって、再度開くと>
ファイルが切り捨てられます(他の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シェルを使用している場合は、他のファイル記述子への書き込みをサポートする別の出力コマンドはprint
次print -u2 FOO
のとおりFOO
ですprint
。echo
Bourneのようなシェルを使用して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
echo
Suchhiのソリューションの代替案を使用するには、このコマンドのオプションをprintf
確認してください。これにより、バックスペースキーを含む特定のエスケープシーケンスを使用できます。改行を抑制するオプションとともに、次のことができます。-e
echo
\b
-n
echo -n "Hello" && sleep 10 && echo -n -e "\b\b\b\b\bworld"