# teeshell
date=$(date +%Y-%m-%d_%H-%M-%S)
randstr=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 4)
dir="$(echo ~/log/"${date}_${randstr}")"
mkdir "$dir"
# Redirect everything to tee and perl
exec 1> >(tee /dev/tty |
perl -pe '
sub reopen {
open(OUT,">'$dir'/".++$i);
select OUT;
$| = 1;
}
BEGIN {
`echo $$ > "'$dir'"/pid`;
reopen();
$SIG{HUP} = \&reopen;
}') 2>&1
# wait for perl to save the pid
while [ ! -f "$dir"/pid ] ; do
true
done
# Magic! Make perl save to a new file with a kill -HUP
PS1="[\$(kill -HUP `cat "$dir"/pid`)][\u@\h:\w]\$ "
Выполнить:
. teeshell
Как уже объяснялось в ZimbiX, используйте двойные кавычки и так далее.
Альтернативой его методу является использование синтаксиса $ '…'
, в котором интерпретируются escape-последовательности. То есть:
\e => ASCII ESC (0x1b, 033)
\033 => ASCII ESC (0x1b, 033)
\x1b => ASCII ESC (0x1b, 033)
Итак:
red=$'\e[31m'
blue=$'\e[34m'
Затем:
printf $blue && sed "s/2/${red}2$blue/g" Hello.txt
Или, если хотите, включите переменную reset :
cc=$'\e[0m'
printf $blue && sed "s/2/$cc${red}2$cc$blue/g" Hello.txt && printf $cc
Чтобы просмотреть код, скажите что-нибудь вроде:
(printf $blue && sed "s/2/${red}2$blue/g" Hello.txt) | cat -v
Также обратите внимание на использование of g
для глобального в sed
.
Во-первых, двойные кавычки необходимы для интерполяции:
$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215
Однако управляющие последовательности ASCII содержат символы, которые влияют на sed, поэтому необходимо преобразовать управляющую последовательность символов в фактические управляющие символы. Это можно сделать с помощью вложенной оболочки. Обратите внимание на конечное /g
, означающее, что в строке разрешено несколько замен.
$ sed "s/2/`echo $RED`2`echo $BLUE`/g" Hello.txt
Теперь, это все еще не совсем правильно. На самом деле мы должны установить начало каждой строки синим цветом, а затем сделать так, чтобы каждая замена 2
начиналась красным цветом и заканчивалась синим. Символ шляпы, ^
, является регулярным выражением, означающим начало строки. Также обратите внимание на трубы и перестановку, чтобы использовать cat
.
$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"
Вы также можете сделать это чище, переместив преобразование подшивки в присвоение переменной. Фигурные скобки необходимы для RED
, чтобы отличить его от символа 2
, чтобы он не пытался использовать несуществующую переменную RED2
.
$ BLUE=`echo '\033[0;34m'`
$ RED=`echo '\033[0;31m'`
$ cat Hello.txt | sed "s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"
Источник: http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/