Я хотел бы отредактировать мой .bashrc так, чтобы каждая команда, выполняемая в оболочке, передавалась по чему-либо, например:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Мне удалось что-то довольно похожее, но не совсем:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Это не желаемый результат, так как это происходит только после выхода из текущей оболочки.
Это в основном для развлечения / обучения.
command-line
bash
bashrc
М. Бесерра
источник
источник
-n
флага дляcowsay
полезно; это заставляет это сохранять пробел.Ответы:
Вы можете немного адаптировать свой метод. Вместо того, чтобы
cowsay
напрямую передавать по трубопроводу , читайте выходные данные до символа-разделителя, отправляйте эти выходные данныеcowsay
, затем печатайте этот символ после каждой команды:Здесь я использую символ ASCII NUL. Вы можете использовать что-то еще, что вряд ли появится в выводе команды.
Это напечатает после приглашения, поэтому вывод будет уродливым:
Обратите внимание, что это сломает любую команду, которая пытается выполнить сложный вывод или имеет текстовый пользовательский интерфейс (например, редакторы командной строки, пейджеры и т. Д.).
Предполагая, что вы уже знаете, что
exec > >(...)
делает, часть в замене процесса:while IFS= read -d '' -r line; do ... done
: это довольно распространенная идиома для чтения данных, разделенных символом ASCII NUL:IFS=
устанавливает IFS в пустую строку, что отключает разделение полей-r
предотвращаетread
обработку\
во вводе специально (\n
например, читается как\n
и не преобразуется в символ новой строки).-d ''
это способ сказать,read
чтобы прочитать, пока символ NULТаким образом, все циклически повторяется над вводом в разделах, разделенных NUL, при максимально возможном сохранении содержимого ввода.
if [[ -n $line ]]; then ... fi; done
- Действовать только в том случае, если прочитанный ввод не является пустым.echo; printf "%s\n" "$line" | cowsay;
- выведите начальную пустую строку, чтобы вывод cowsay не конфликтовал с подсказкой, а затем отправьте введенные данные до сих пор в cowsay.printf
надежнее и безопаснее, чемecho
.источник
Вы можете
trap
и злоупотреблятьDEBUG
сигналом Баша:Пример запуска
Однако это все равно выполнит команду позже. Благодаря ilkkachu я нашел способ обойти это:
источник