Простым (и некрасивым) взломом было бы добавить это к вашему ~/. bashrc
:
echorun(){
echo "# $@";
"$@"
}
Затем Вы бы выполнили свою команду как
echorun ls /usr > list-redir.txt
, что не позволит Вам отличить ls /usr >foo
от ls /usr | tee foo
, но это добавит # ls /usr
к началу foo
.
На самом деле, я просто понял, что ответ от @terdon может не работать с более сложным командным конвейером; поэтому я придумал следующий псевдоним (названный er
) как сокращение от @tendon's echorun
):
#alias er=' cat <(echo "# cmd: $(history 1)") - | tee' # last tee is not needed, so:
alias er=' cat <(echo "# cmd: $(history 1)") -'
Идея в том, что |er
должен быть вставлен перед последней трубой или перенаправлен в командную строку; тогда, действительно, это счастливое совпадение, что в этот момент история 1
в точности ссылается на текущую командную строку! Таким образом, она может быть эхом сначала, перед остальными (то, что находится в этой точке) стандартными входами, с помощью cat
. Итак, теперь мы можем делать такие вещи, как:
$ ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
# cmd: 125 ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
posix_types_32.h
posix_types_64.h
posix_types.h
$ ls /usr/include/asm | grep 's*.h' | grep 'ig' |er >> mylist.txt
$ cat mylist.txt
# cmd: 125 ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
posix_types_32.h
posix_types_64.h
posix_types.h
# cmd: 126 ls /usr/include/asm | grep 's*.h' | grep 'ig' |er >> mylist.txt
sigcontext32.h
sigcontext.h
siginfo.h
signal.h
Таким образом, мы имеем полную командную строку из нескольких труб - и нам не нужно беспокоиться о том, чтобы что-нибудь ускользнуть - в основном, просто добавьте er
к последней трубе. Единственная небольшая кляча - это номер истории (это меня не так сильно беспокоит, иначе я бы добавил дополнительный awk
в псевдоним).
Вы можете просто сделать это:
{ cmd="ls /usr/include/asm"
echo "$cmd" ; $cmd
} >./list-redir.txt
По крайней мере, я думаю, что это то, что вы хотите сделать. Это даст результат вроде:
$ cat <./list-redir.txt
###OUTPUT###
ls /usr/include/asm
#output of above command#
...
Вы также можете посмотреть команду script
, которая будет записывать ваш сеанс терминала, включая то, что вы вводите, и весь вывод. Хотя иногда он может быть немного запутанным, так как он будет записывать все, что вы вводите, включая любые пробелы и т. Д.
$ script
Script started, file is typescript
$ ls /usr/include/asm
a.out.h ioctl.h mtrr.h setup.h termios.h
auxvec.h ioctls.h param.h shmbuf.h types.h
bitsperlong.h ipcbuf.h poll.h sigcontext32.h ucontext.h
boot.h ist.h posix_types_32.h sigcontext.h unistd_32.h
bootparam.h kvm.h posix_types_64.h siginfo.h unistd_64.h
byteorder.h kvm_para.h posix_types.h signal.h unistd.h
debugreg.h ldt.h prctl.h socket.h vm86.h
e820.h mce.h processor-flags.h sockios.h vsyscall.h
errno.h mman.h ptrace-abi.h statfs.h
fcntl.h msgbuf.h ptrace.h stat.h
hw_breakpoint.h msr.h resource.h swab.h
hyperv.h msr-index.h sembuf.h termbits.h
$ exit
exit
Script done, file is typescript
$ cat typescript
Script started on Sat 29 Aug 2015 10:32:52 AM EDT
$ ls /usr/include/asm
a.out.h ioctl.h mtrr.h setup.h termios.h
auxvec.h ioctls.h param.h shmbuf.h types.h
bitsperlong.h ipcbuf.h poll.h sigcontext32.h ucontext.h
boot.h ist.h posix_types_32.h sigcontext.h unistd_32.h
bootparam.h kvm.h posix_types_64.h siginfo.h unistd_64.h
byteorder.h kvm_para.h posix_types.h signal.h unistd.h
debugreg.h ldt.h prctl.h socket.h vm86.h
e820.h mce.h processor-flags.h sockios.h vsyscall.h
errno.h mman.h ptrace-abi.h statfs.h
fcntl.h msgbuf.h ptrace.h stat.h
hw_breakpoint.h msr.h resource.h swab.h
hyperv.h msr-index.h sembuf.h termbits.h
$ exit
exit
Script done on Sat 29 Aug 2015 10:33:00 AM EDT