更新时间:2023-12-04 12:30:28
将换行符替换为
tar -options -f dest source |回车。切-b1-$(tput cols)| sed -u'i\\o033 [2K | stdbuf -o0 tr'\n'\r'; echo
说明:
cut -b1-$(tput cols)
:如果tar长于终端宽度,则截断tar的输出。
sed -u'i\\ 033o033 [2K'
:在每行的开头插入一行空白。 sed的 -u
选项将其置于非缓冲模式。 stdbuf -oL sed'i\\033 [2K'
也将同样有效。
stdbuf -o0 tr'\n''\r'
:使用 tr
交换换行符和回车符。 Stdbuf确保输出未缓冲;如果在行缓冲终端上没有 \n
,我们将看不到任何输出。
echo
:输出最后一个换行符,以便终端提示符不会吃掉最后一行。
针对您的编辑建议的问题:
x = 0;
echo -e’e [s];
tar -options -f dest源|边读边;做
echo -en \e [u
if [$ x gt 0];然后回显-en \e [ $ x B; fi;
echo -en \e [2K
echo -n $ line |削减-b1-$(tput cols);
让 x =($ x + 1)%5;
完成;回声;
可以将所有内容随意粘贴到一行上。实际上,这为原始问题提供了另一种解决方案:
echo -e’\e [s]; tar -options -f dest源|边读边;做echo -en \e [u\e2K; echo -n $ line |削减-b1-$(tput cols);完成echo
除了VT100代码外,它完全不依赖任何内容。
Is it possible to get the output of a command - for example tar
- to write each line of output to one line only?
Example usage:
tar -options -f dest source | [insert trickery here]
and the output would show every file being processed without making the screen move: each output overwrites the last one. Can it be done?
Edit: we seem to have a working answer, but lets take it further: How about doing the same, but over 5 lines? You see a scrolling output that doesn't affect the rest of the terminal. I think I've got an answer, but I'd like to see what you guys think.
Replace the newlines with carriage returns.
tar -options -f dest source | cut -b1-$(tput cols) | sed -u 'i\\o033[2K' | stdbuf -o0 tr '\n' '\r'; echo
Explanation:
cut -b1-$(tput cols)
: Truncates the output of tar if it is longer than the terminal is wide. Depending on how little you want your terminal to move, it isn't strictly necessary.
sed -u 'i\\o033[2K'
: Inserts a line blank at the beginning of each line. The -u
option to sed puts it in unbuffered mode. stdbuf -oL sed 'i\\033[2K'
would work equally as well.
stdbuf -o0 tr '\n' '\r'
: Uses tr
to exchange newlines with carriage returns. Stdbuf makes sure that the output is unbuffered; without the \n
's, on a line buffered terminal, we'd see no output.
echo
: Outputs a final newline, so that the terminal prompt doesn't eat up the final line.
For the problem your edit proposes:
x=0;
echo -e '\e[s';
tar -options -f dest source | while read line; do
echo -en "\e[u"
if [ $x gt 0 ]; then echo -en "\e["$x"B"; fi;
echo -en "\e[2K"
echo -n $line | cut -b1-$(tput cols);
let "x = ($x+1)%5";
done; echo;
Feel free to smush all that onto one line. This actually yields an alternative solution for the original problem:
echo -e '\e[s'; tar -options -f dest source | while read line; do echo -en "\e[u\e2K"; echo -n $line | cut -b1-$(tput cols); done; echo
which neatly relies on nothing except VT100 codes.