CommandLine-Fuでなんだこれというのを見つけたので...
echo の \b
[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ファッ!?
プラス '+' が 80個ってどういうことよ。
解説
echoコマンドの -e は バックスラッシュでエスケープした文字を解釈させるオプション。
echoコマンドの -e \b は バックスペースの意味
DESCRIPTION
-e enable interpretation of backslash escapes
\b backspace
このバックスペースって何よ?っというのは、普通にバックスペースしているってこと。文字1つ削れるよ。
[dharry@frank ~]$ echo -e '123'
123
[dharry@frank ~]$ echo -e '12\b3'
13
で、なぜか、最後に\bを入れてもダメ。不思議。後ろにスペースを入れないといけない。
[dharry@frank ~]$ echo -e '12'
12
[dharry@frank ~]$ echo -e '12\b'
12
[dharry@frank ~]$ echo -e '12\b '
1
中身みると、バックスペース(0x08)入れてるっぽい。制御文字を出すようにcatするとC-Hが表示される。
なるほどねー。イメージとしては手で高速に入力して最後にバックスペースを入れてエンター押されているような感じだね。
[dharry@frank ~]$ echo -e '12\b' | hexdump -C
00000000 31 32 08 0a |12..|
00000004
[dharry@frank ~]$ echo -e '12\b' | cat -v hoge.txt
12^H
じゃあ、CommandLine-Fuのやつに戻って。
{1..80}はよく使うブレース展開 (brace expansion) ってやつですね。ホント便利。
ブレース展開の前後に文字つけてあげれば、それ付きで展開される。でも、通常のブレース展開だけだと、展開したものはスペースが入ってしまう。
[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[dharry@frank ~]$ echo {1..5}
1 2 3 4 5
[dharry@frank ~]$ echo {1..5}+
1+ 2+ 3+ 4+ 5+
[dharry@frank ~]$ echo hoge{1..5}
hoge1 hoge2 hoge3 hoge4 hoge5
じゃあ、\bでスペースを削ってあげればいいんだ...でもうまくいかない...
ああ、そうか、ブレース展開した文字の変数を作り、その変数をechoしてNullStringとして出力されればいいじゃん。
[dharry@frank]~% echo {1..5}'\b+'
+ + + + +
[dharry@frank]~% echo {1..5}'\b+ '
+ + + + +
[dharry@frank ~]$ echo -e ''$_{1..5}'\b+' | cat -v
^H+ ^H+ ^H+ ^H+ ^H+
[dharry@frank ~]$ echo -e ''$_{1..5}'\b+'
+++++
結論
というので、CommandLine-Fuのワンライナーは ブレース展開をNullStringで出力して、バックスペースで消していました。
$_{1..5} と アンダーバーを使っているけど、このアンダーバーは何でもよくて、代入されていない変数であればいいです。
[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+' | cat -v
^H+ ^H+ ^H+ ^H+ ^H+
[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+'
+++++
別のやつ
ここまで説明して最後にどうかと思いますが、あまりこの処理は好きじゃないです。
こっちの方が良いと思う。
[dharry@frank ~]$ zsh
[dharry@frank]~% repeat 80 echo -n '+'; echo
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[dharry@frank ~]$ seq -s + 81 | sed "s/[0-9]//g"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[dharry@frank ~]$ echo "" | awk '{ for(i=0;i<80;i++) printf("+"); print }'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++