Повторение прогресса от фонового процесса, не угоняя подсказку

.bashrc только читается интерактивными оболочками. (На самом деле это - упрощение: удар является изворотливым в этом отношении. Bash не читает .bashrc если это - оболочка входа в систему, интерактивная или нет. И существует исключение даже к исключению: если родительский процесс удара rshd или sshd, затем удар действительно читает .bashrc, является ли это интерактивным или нет.)

Положите свои функциональные определения на файл в известном месте и используйте . (также записанный source) встроенный для включения того файла в сценарий.

$ cat ~/lib/bash/my_functions.bash
foo () {
…
$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar

Если Вы хотите, можно следовать за функцией автозагрузки ksh. Поместите каждое функциональное определение в файл с тем же именем как функция. Перечислите каталоги, содержащие функциональные определения в FPATH переменная (разделенный от двоеточия список каталогов). Вот грубое приближение ksh's autoload который на самом деле сразу загружает функцию вместо по запросу:

autoload () {
  set -- "$(set +f; IFS=:;
            for d in $FPATH; do
              if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
            done)"
  [[ -n $1 ]] && . "$1"
}
10
15.12.2014, 01:39
1 ответ

Это вопрос времени: Bash запускает команду Hello в фоновом режиме, то он отображает подсказку, чтобы вы ввести новую команду, то команда «Фоновая команда» выход. Когда вы входите в следующую командную строку (пустая командная строка, если вы просто нажимаете Enter ), Bash отображает уведомление о том, что фоновое задание закончилось, затем следующую подсказку.

Вы можете захотеть экспериментировать с помощью сценария, который начинается с спать 3 и начать печатать только после запуска скрипта на заднем плане, чтобы увидеть, что происходит в темпе, вы можете следовать.

Вы можете заставить Bash уведомить вас сразу, когда фоновое задание завершается, устанавливая опцию Notify с помощью , установлена ​​-B . Тогда вы увидите:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

Bash не перерезает запрос в этом случае. Вы все еще редактируете командную строку в подсказке, которая появилась до напечатанной фоновой задачи Hello World! . Вы можете перерисовать текущую строку, нажав ESC 1 Ctrl + L . Возможно, вы захотите связать команду RedRaw-read-Line в более удобную клавишу; Например, иметь Ctrl + L L RedRaw текущая линия и Ctrl + Alt + l Очистить Экран, добавьте следующие строки в ваш ~ / .InPUTRC :

"\C-l": redraw-current-line
"\e\C-l": clear-screen

Я не знаю способа сделать Bash RedRaw Princ Prince автоматически. ZSH делает это по умолчанию.

13
27.01.2020, 20:02

Теги

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