Почему вы получаете то, что вы получаете
Когда вы запускаете скрипт в фоновом режиме, он не может принимать пользовательский ввод.Фактически, программа остановится, если ожидает ввода пользователя, пока не вернется на передний план.Однако вывод должен идти куда-то .Таким образом, вывод выводится на экран (даже если программа работает в фоновом режиме. Таким образом, вы видите подсказку.
Подсказка, которую вы видите при отображении вашей программы, не имеет смысла, потому что вы не можете вводить в подсказкеВместо этого вы вводите 360
, и ваша оболочка интерпретирует ее как команду, которую вы хотите, потому что вы не помещаете ее в программу, вы помещаете ее в командную строку.
Вы хотите, чтобы вашаПрограмма должна быть на переднем плане для ввода, но работать в фоновом режиме. Вы не можете сделать оба сразу.
Решения вашей дилеммы
У вас может быть две программы. Первая занимаетввод, а второй запускает реальную программу в фоновом режиме.
Примерно так:
#! /bin/ksh
read time?"How long in seconds do you want to run the job? "
my_actual_job.ksh $time &
На самом деле, вы могли бы даже иметь механизм для запуска задания в фоновом режиме, есливремя превышает определенный лимит, но в противном случае запустите задание на переднем плане.
#! /bin/ksh
readonly MAX_FOREGROUND_TIME=30
read time?"How long in seconds do you want to run the job? "
if [ $time -gt $MAX_FOREGROUND_TIME ]
then
my_actual_job.ksh $time &
else
my_actual_job.ksh $time
fi
Также помните, что если задание находится в фоновом режиме, оно не может печатать на экране.перенаправить вывод в другое место, но если вы этого не сделаете, он выведет на экран в неподходящее время.Например, вы могли бы в VI редактировать файл, и вдруг в середине сеанса VI выглядело чмокано.
Я полагаю, что есть простой способ узнать, является ли ваша работана заднем плане, но я не могу вспомнить это случайно.Вы можете найти свой текущий идентификатор процесса, посмотрев на $$
, затем посмотрев на вывод jobs -p
и посмотреть, есть ли этот идентификатор процесса в списке.Тем не менее, я уверен, что кто-то придумает простой способ сказать.
Также возможно, что программа может переместиться в фоновый режим с помощью команды bg $$
.
НекоторыеСоветы
Если вы используете Kornshell, вы можете воспользоваться многими специальными функциями Kornshell:
print : print
Команда более гибкая и надежная, чем echo
.Взгляните на справочную страницу для Kornshell и ознакомьтесь со всеми его функциями.
read : вы заметили, что можете использовать форму read var?"prompt"
команды read.
readonly : Используйте readonly для объявления констант.Таким образом, вы случайно не измените значение этой переменной позже.Кроме того, это хорошая техника программирования.
typeset : взгляните на typeset
на странице руководства ksh.Команда typeset
может помочь вам объявить определенные переменные как числа с плавающей запятой по сравнению с вещественными и может автоматически выполнять такие операции, как заполнение нулями, выравнивание по правому или левому краю и т. Д.в Kornshell:
Команды awk
и sed
также могут делать то, что делает grep
, поэтому нет никакой причины фильтровать что-либо через grep
, а затем через awk
или sed
.
Вы можете объединить grep
с, используя параметр -e
.grep foo | grep bar
совпадает с grep -e foo -e bar
.
Надеюсь, это поможет.