Вставка текста командной строки, прежде чем произведено в stdout (для канала / перенаправление)

[112097] Я предлагаю вам выполнить скрипт, который перекроет все команды, которые вы обычно используете для редактирования файлов, поэтому вместо него, например, используется [112454] меньше [112455]:

  • Это всего лишь пример, но при выполнении такого скрипта вероятность того, что вы измените любой файл, будет определённо уменьшена (и вы, вероятно, сможете завершить список). Вы даже можете интегрировать эти изменения в ваш [112456].bashrc[112457] или файл профиля, вы можете обратиться к [112458] этому ответу в зависимости от вашей оболочки [112459], так что он будет постоянным и построить скрипт, который восстановит псевдонимы, как этот, так что модификация вашей системы будет только намеренной:
1
29.08.2015, 17:35
4 ответа

Простым (и некрасивым) взломом было бы добавить это к вашему ~/. bashrc:

echorun(){
    echo "# $@";
    "$@"
}

Затем Вы бы выполнили свою команду как

echorun ls /usr > list-redir.txt

, что не позволит Вам отличить ls /usr >foo от ls /usr | tee foo, но это добавит # ls /usr к началу foo.

.
2
27.01.2020, 23:21

На самом деле, я просто понял, что ответ от @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 в псевдоним).

0
27.01.2020, 23:21

Вы можете просто сделать это:

{   cmd="ls /usr/include/asm"
    echo "$cmd" ; $cmd
} >./list-redir.txt

По крайней мере, я думаю, что это то, что вы хотите сделать. Это даст результат вроде:

 $ cat <./list-redir.txt

 ###OUTPUT###

   ls /usr/include/asm
 #output of above command#
   ...
2
27.01.2020, 23:21

Вы также можете посмотреть команду 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
0
27.01.2020, 23:21

Теги

Похожие вопросы