sh и глобальные переменные
Модератор: Модераторы разделов
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
sh и глобальные переменные
Необходимо поменять переменную $LANG (из скрипта), чтобы после выхода из него переменная была изменена в самой системе (тоесть - в другой сессии). Возможно ли такое без перезагрузки шелла? Уже все перерыл: /etc/profile мне не подходит, т.к. нужно logout'иться. Нужно именно из скрипта это сделать. Но как?
Спасибо!
Спасибо!
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sh и глобальные переменные
а запихнуть команду присвоения в пользовательский стартовый скрипт тоже не подходит?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
Да, тоже не катит. Нужно чтоб было что-то вроде:
Код: Выделить всё
#!/bin/sh
LANG=XXX
export LANGИ чтобы после выполнения этого скрипта менялась переменная LANG в сеансе шелла, под которым работает юзверь. Все книги перекопал - ничего не нашел по этой теме. Видимо нельзя изменять значение переменной из другой сессии=(
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: sh и глобальные переменные
Если только так
Это не совсем баш-скрипт, но всё же. Просто когда запускается скрипт, для него запускается новый шелл, и все изменения в нём не влияют на основной.. вроде..
Код: Выделить всё
% cat test.sh
export LANG=C
% echo $LANG
ru_RU.UTF-8
% . ./test.sh
% echo $LANG
CЭто не совсем баш-скрипт, но всё же. Просто когда запускается скрипт, для него запускается новый шелл, и все изменения в нём не влияют на основной.. вроде..
-
Aquarius
- Сообщения: 132
- ОС: FreeBSD 6.2-RELEASE-p1
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
Ну вроде ж не такая сложная задача для такого толкового ЯП, а не предусмотрели...Придется извращаться=(
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: sh и глобальные переменные
а это не проблема шелла. это вообще не проблема. это особенность системы переменных окружения в *nix, благодаря которой эти переменные вообще имеют смысл...
слава роботам!
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
ого, филосовски получилось=)
-
snake
- Бывший модератор
- Сообщения: 677
Re: sh и глобальные переменные
На самом деле все просто: потомок получает копию окружения родителя, все изменения, что он там сделает будут изменениями в его окружении и, естественно, на родительское окружение не повлияют. Окружение живет ровно столько сколько и процесс с этим окружением связаный. В этом то собака у автора и порылась. Насколько я понял, автор хотел создать скрипт который запустившись поставить нужные значения переменных окружения для дальнейшей работы. Так вот, это невозможно в силу самой природы переменных окружения. -- Те переменные окружения, что скрипт поменяет, будут действительны только для этого процесса (скрипта) и его потомков, т.к. сам этот скрипт является потомком шела и на окружение родителя воздействовать не может.
Единственный способ решить проблему -- прописать нужные значения в конфиге командного интерпритатора.
В реальности все не так, как на самом деле...
JabberID: zmeyk@jabber.ru
JabberID: zmeyk@jabber.ru
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: sh и глобальные переменные
Вот как раз установить переменные окружения для дальнейшей работы достаточно просто:
Код: Выделить всё
~ $ cat test.sh
#!/bin/bash
export MY="test";
exec bash;достаточно просто запустить bash как потомок шелла в котором будет установлена переменная. Вот каким образом влиять на переменные в уже запущенных шеллах ... в этом вопрос я так понял.
-
router
- Сообщения: 363
- ОС: Debian, на работе rhel
Re: sh и глобальные переменные
snake писал(а): ↑21.07.2006 20:17Насколько я понял, автор хотел создать скрипт который запустившись поставить нужные значения переменных окружения для дальнейшей работы. Так вот, это невозможно в силу самой природы переменных окружения. -- Те переменные окружения, что скрипт поменяет, будут действительны только для этого процесса (скрипта) и его потомков, т.к. сам этот скрипт является потомком шела и на окружение родителя воздействовать не может.
На этот вопрос вроде уже ответил v04bvs: запускать скрипт
Код: Выделить всё
. <имя скрипта>При этом не создаётся дочерний процесс, скрипт выполняется оболочкой, из-под которой был запущен.
От себя добавлю, что то же самое делает команда source
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: sh и глобальные переменные
но если очень хочется править переменные окружения любого процесса, то накатайте маленький патчик на ядро, который сделает /proc/_PID_/environ доступным для записи....
слава роботам!
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
огромное всем спасибо за ответы.
есть еще вопрос (правда немного не по теме). как можно убить процесс системной консоли, с которой был запущен скрипт?
`kill -9 $$` убивает только выполнение скрипта.
есть еще вопрос (правда немного не по теме). как можно убить процесс системной консоли, с которой был запущен скрипт?
`kill -9 $$` убивает только выполнение скрипта.
-
mitya
- Сообщения: 54
Re: sh и глобальные переменные
Хмм, можно сделать grep на ps, для получения pid процесса шелла, например. Хотя, в таком случае, скрипт тоже умрёт, наверное, ибо child. Но, если запускать с "-nohup"... Напиши, что получится, вообщем.
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
Идея хорошая конечно, т.к. с помощью ps, grep, awk можно вычислить и убить pid, но проблема в другом: как узнать какой терминал именно убивать?=)
Тоесть мне нужно следующее: запускается скрипт и он убивает процесс системной консоли (вместе со скриптом, разумеется).
-
router
- Сообщения: 363
- ОС: Debian, на работе rhel
Re: sh и глобальные переменные
soko1
Всё гораздо проще. exit
Ессно, если скрипт выполняется без вызова дочернего процесса
Всё гораздо проще. exit
Ессно, если скрипт выполняется без вызова дочернего процесса
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
=)))))
exit завершит работу скрипта, а мне надо чтобы завершалась сессия, с которой он был запущен.
Простой пример. Я сижу в 1-ой системной консоли. Запускаю скрипт:
%./test.sh
и после этого я logout'чусь...
-
Liksys
- Сообщения: 2910
Re: sh и глобальные переменные
-
router
- Сообщения: 363
- ОС: Debian, на работе rhel
Re: sh и глобальные переменные
soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт
на tty1
опаньки, logout
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт
Код: Выделить всё
#!/bin/sh
exitна tty1
Код: Выделить всё
. test.shопаньки, logout
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
router писал(а): ↑24.07.2006 22:19soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт
Код: Выделить всё
#!/bin/sh exit
на tty1
Код: Выделить всё
. test.sh
опаньки, logout
Прошу прощения=) Невнимателен был я.
Спасибо!
Как? Я уже знаю способ (благодаря router), но не помешает еще один.
-
Liksys
- Сообщения: 2910
Re: sh и глобальные переменные
Этот способ несовершенен, первое, что прешло в голову. killall $TERM. Убивает все терминалы, похожие на родительский.
-
router
- Сообщения: 363
- ОС: Debian, на работе rhel
Re: sh и глобальные переменные
Хм... можно подробнее?
Код: Выделить всё
router@panzer:~$ echo $TERM
linux
router@panzer:~$ pgrep $TERM
router@panzer:~$ killall $TERM
linux: no process killedВ консоли, разумеется
добавлено:
Кажется, понял. Но это лишь для псевдотерминалов, а речь шла о консоли ?
добавлено:
Есть ещё способ.
Шелл, запущенный непосредственно логином, имеет префикс '-' c списке выдаваемом
Код: Выделить всё
ps a-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
router писал(а): ↑24.07.2006 23:38добавлено:
Есть ещё способ.
Шелл, запущенный непосредственно логином, имеет префикс '-' c списке выдаваемомКонсоль можно получить командой tty. Осталось только выделить pid и дать команду kill -9Код: Выделить всё
ps a
Вот! Это то что и требовалось (забыл про существование команды `tty`).
Спасибо всем.
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
router писал(а): ↑24.07.2006 22:19soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт
Код: Выделить всё
#!/bin/sh exit
на tty1
Код: Выделить всё
. test.sh
опаньки, logout
Не поверишь, но я попробовал и этот метод не прокатил=( Так что придется tty'ом...
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: sh и глобальные переменные
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
Понимаешь, мне ж из скрипта нужно, а не из консоли. Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:
Код: Выделить всё
notebook$ sh test.sh
source: not found-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: sh и глобальные переменные
подожди .. тебе нужно чтобы твой основной shell-скрипт после завершения работы завершал сеанс ... так вот основной скрипт и запускай как source <script> и в нем допиши в конце exit .... или так не подходит?
Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:
нужно source <путь к файлу>, если что ...
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
diesel писал(а): ↑10.08.2006 00:52
подожди .. тебе нужно чтобы твой основной shell-скрипт после завершения работы завершал сеанс ... так вот основной скрипт и запускай как source <script> и в нем допиши в конце exit .... или так не подходит?
Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:
нужно source <путь к файлу>, если что ...
Не, не катит это все=(
Сегодня придумал способ!!
Ставим утилиту skill и пишем в основном скрипте
Код: Выделить всё
skill -HUP `tty`Так пашет. Но проблема еще одна: этот способ не пашет в иксах. Тоесть, если я запускаю скрипт из иксов - отказывается работать...ну да ладно, может что опять в голову придет...
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: sh и глобальные переменные
Код: Выделить всё
ds ~ $ cat test.sh
#!/bin/bash
echo "My test script";
echo "Here i do smth";
exit;
ds ~ $ source ./test.shВот так у меня выходит из скрипта, если в Х-ах то закрывает терминал... или если вам не это надо, то может объясните как-нить по-другому? Может код приведете? Первоначальную задачу скажите?
-
soko1
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: sh и глобальные переменные
diesel писал(а): ↑10.08.2006 16:25Код: Выделить всё
ds ~ $ cat test.sh #!/bin/bash echo "My test script"; echo "Here i do smth"; exit; ds ~ $ source ./test.sh
Вот так у меня выходит из скрипта, если в Х-ах то закрывает терминал... или если вам не это надо, то может объясните как-нить по-другому? Может код приведете? Первоначальную задачу скажите?
Так у меня тоже работает, но видимо вы меня не так поняли. Мне нужно вот что. Имеется скрипт, в котором допустим имеется следующий пункт (это я для наглядности) "1:выйти из терминала", пользователь нажимает 1 и выходит из терминала, будь то системная консоль, будь то графический терминал (но важно еще то, чтобы терминал с которого запущены иксы тоже сделал logout)...Получается, что стандартными средствами этого сделать нельзя (по крайней мере мне такие не извесны). Поэтому я случайно наткнулся на skill. Но я поборол только одну проблему: выход со скипта из системной консоли, но при запуске скрипта допустим из Xterm выхода из системной консоли не происходит (видимо из-за того что другой tty).