LINUX.ORG.RU

Непонятно работает бесконечный цикл в bash.

 ,


0

1

Почему появляется бесконечный ввод строки?

stop=1

file staf:

#!/bin/bash

function staf 

{
	
	while [ $stop -eq 1 ]
	do
	echo "$stop" > /home/timey/smt/tmpfile
	done 
		
}

Итог:

tvr > . ~/smt/staf 
tvr > staf
работает ввод строки...
продолжает работать ввод строки...
и так далее...
далее...
далее...


Последнее исправление: Cl_Magenta (всего исправлений: 1)

Так $stop не меняется внутри цикла. Только выводится в файл.

И лучше в условии while кавычки тоже использовать.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Да, $stop не меняется внутри файла. Скрипт берет значение переменной из родительской оболочки. Если stop=0, то скрипт просто исполняется и закрывается, потому что закрывается цикл. Но если значение stop=1, цикл должен бесконечно отправлять значение «1» в tmpfile.

Но почему после запуска скрипта появляется ввод? Это не предусмотрено циклом, не предусмотрено функцией staf.

Cl_Magenta
() автор топика
Ответ на: комментарий от Cl_Magenta

Понял, спасибо. Терминал ждет пока выполнится команда.

Нет. Терминал ничего не ждет. Он обеспечивает ввод-вывод по терминальному протоколу. Это очень сложная тема, один из столпов юникса, так как тут всплывает понятия режимов терминального протокола, который переключается в разный тип интерактивными программами типа интерактивного режима оболочки и прочих редакторов и выключение его при запуске других программ, которые тоже могут поменять режим, как это происходит при запуске например редактора текста и пр. А режим и определяет, будет ли отображаться символы до ввода, будет ли они сброшены перед вводом, будут ли срабатывать символы со спец значением, например, в стандартном режиме Ctrl-C - терминал пошлёт сигнал SIGINT текущей программе, либо это будет просто символ скажем для копирования в редакторе. Так что уверяю вас, чтобы это действительно описать потребуется несколько полноценных статей.

vodz ★★★★★
()
Ответ на: комментарий от Cl_Magenta

Скрипт берет значение переменной из родительской оболочки.

Чтобы переменные родителя были доступны детям, как раз и нужно волшебное слово export.

akk ★★★★★
()
Ответ на: комментарий от vodz

Если вы сможете подсказать мне, где можно познакомится со статьями, где описываются базовые основы работы терминала, я буду Вам признателен. В интернете много сумбурных статей, но найти хороший материал – большая удача, с моей точки зрения.

Cl_Magenta
() автор топика
Ответ на: комментарий от akk

В данном случае staf это функция, которая вначале инициализируется при помощи команды «.» в основном процессе. Когда функция запускается, она использует переменные окружения основного процесса, в котором запущена. Это мое понимание происходящего.

Cl_Magenta
() автор топика
Ответ на: комментарий от Cl_Magenta

В интернете много сумбурных статей, но найти хороший материал – большая удача, с моей точки зрения.

Это еще что, до сих пор терминал пилится и пилится в развивающихся системах. Я не знаю современные книги, всё это я читал 35 лет назад, а сейчас, если захочу, сам напишу.

vodz ★★★★★
()
Ответ на: комментарий от Cl_Magenta

В данном случае staf это функция, которая вначале инициализируется при помощи команды «.» в основном процессе. Когда функция запускается, она использует переменные окружения основного процесса, в котором запущена. Это мое понимание происходящего.

Увы, ваш код некорректен идеологически. Правильно было б так: если переменная установлена, то вызывается функция, а такой цикл допустим только в случае, если переменная меняется обработчиком прерывания.

vodz ★★★★★
()
Ответ на: комментарий от vodz

такой цикл допустим только в случае, если переменная меняется обработчиком прерывания.

Да, переменная должна меняться – в конечном написании скрипта. Сейчас я просто изучаю, как работают параллельные, фоновые процессы.

Cl_Magenta
() автор топика
Ответ на: комментарий от nerve

Habr хороший ресурс: много понятных материалов для новичков. Я им постоянно пользуюсь. Статью прочитаю обязательно.

Cl_Magenta
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.