sh и глобальные переменные

Модератор: Модераторы разделов

Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

sh и глобальные переменные

Сообщение soko1 »

Необходимо поменять переменную $LANG (из скрипта), чтобы после выхода из него переменная была изменена в самой системе (тоесть - в другой сессии). Возможно ли такое без перезагрузки шелла? Уже все перерыл: /etc/profile мне не подходит, т.к. нужно logout'иться. Нужно именно из скрипта это сделать. Но как?
Спасибо!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sh и глобальные переменные

Сообщение sash-kan »

а запихнуть команду присвоения в пользовательский стартовый скрипт тоже не подходит?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

sash-kan писал(а):
17.07.2006 21:23
а запихнуть команду присвоения в пользовательский стартовый скрипт тоже не подходит?

Да, тоже не катит. Нужно чтоб было что-то вроде:

Код: Выделить всё

#!/bin/sh
LANG=XXX
export LANG

И чтобы после выполнения этого скрипта менялась переменная LANG в сеансе шелла, под которым работает юзверь. Все книги перекопал - ничего не нашел по этой теме. Видимо нельзя изменять значение переменной из другой сессии=(
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: sh и глобальные переменные

Сообщение v04bvs »

Если только так

Код: Выделить всё

% cat test.sh
export LANG=C
% echo $LANG
ru_RU.UTF-8
% . ./test.sh
% echo $LANG
C


Это не совсем баш-скрипт, но всё же. Просто когда запускается скрипт, для него запускается новый шелл, и все изменения в нём не влияют на основной.. вроде..
Спасибо сказали:
Aquarius
Сообщения: 132
ОС: FreeBSD 6.2-RELEASE-p1

Re: sh и глобальные переменные

Сообщение Aquarius »

точнее, НЕ запускается новый шелл
Computer is Only a Tool
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

Ну вроде ж не такая сложная задача для такого толкового ЯП, а не предусмотрели...Придется извращаться=(
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: sh и глобальные переменные

Сообщение elide »

а это не проблема шелла. это вообще не проблема. это особенность системы переменных окружения в *nix, благодаря которой эти переменные вообще имеют смысл...
слава роботам!
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

elide писал(а):
21.07.2006 03:56
а это не проблема шелла. это вообще не проблема. это особенность системы переменных окружения в *nix, благодаря которой эти переменные вообще имеют смысл...

ого, филосовски получилось=)
Спасибо сказали:
snake
Бывший модератор
Сообщения: 677

Re: sh и глобальные переменные

Сообщение snake »

soko1 писал(а):
21.07.2006 19:20
elide писал(а):
21.07.2006 03:56

а это не проблема шелла. это вообще не проблема. это особенность системы переменных окружения в *nix, благодаря которой эти переменные вообще имеют смысл...

ого, филосовски получилось=)

На самом деле все просто: потомок получает копию окружения родителя, все изменения, что он там сделает будут изменениями в его окружении и, естественно, на родительское окружение не повлияют. Окружение живет ровно столько сколько и процесс с этим окружением связаный. В этом то собака у автора и порылась. Насколько я понял, автор хотел создать скрипт который запустившись поставить нужные значения переменных окружения для дальнейшей работы. Так вот, это невозможно в силу самой природы переменных окружения. -- Те переменные окружения, что скрипт поменяет, будут действительны только для этого процесса (скрипта) и его потомков, т.к. сам этот скрипт является потомком шела и на окружение родителя воздействовать не может.

Единственный способ решить проблему -- прописать нужные значения в конфиге командного интерпритатора. ;)
В реальности все не так, как на самом деле...
JabberID: zmeyk@jabber.ru
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: sh и глобальные переменные

Сообщение diesel »

snake писал(а):
21.07.2006 20:17
Насколько я понял, автор хотел создать скрипт который запустившись поставить нужные значения переменных окружения для дальнейшей работы. Так вот, это невозможно в силу самой природы переменных окружения.

Вот как раз установить переменные окружения для дальнейшей работы достаточно просто:

Код: Выделить всё

~ $ cat test.sh
#!/bin/bash

export MY="test";
exec bash;


достаточно просто запустить bash как потомок шелла в котором будет установлена переменная. Вот каким образом влиять на переменные в уже запущенных шеллах ... в этом вопрос я так понял.
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: sh и глобальные переменные

Сообщение router »

snake писал(а):
21.07.2006 20:17
Насколько я понял, автор хотел создать скрипт который запустившись поставить нужные значения переменных окружения для дальнейшей работы. Так вот, это невозможно в силу самой природы переменных окружения. -- Те переменные окружения, что скрипт поменяет, будут действительны только для этого процесса (скрипта) и его потомков, т.к. сам этот скрипт является потомком шела и на окружение родителя воздействовать не может.

На этот вопрос вроде уже ответил v04bvs: запускать скрипт

Код: Выделить всё

. <имя скрипта>

При этом не создаётся дочерний процесс, скрипт выполняется оболочкой, из-под которой был запущен.
От себя добавлю, что то же самое делает команда source
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: sh и глобальные переменные

Сообщение elide »

но если очень хочется править переменные окружения любого процесса, то накатайте маленький патчик на ядро, который сделает /proc/_PID_/environ доступным для записи....
слава роботам!
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

огромное всем спасибо за ответы.
есть еще вопрос (правда немного не по теме). как можно убить процесс системной консоли, с которой был запущен скрипт?
`kill -9 $$` убивает только выполнение скрипта.
Спасибо сказали:
Аватара пользователя
mitya
Сообщения: 54

Re: sh и глобальные переменные

Сообщение mitya »

soko1 писал(а):
23.07.2006 18:45
огромное всем спасибо за ответы.
есть еще вопрос (правда немного не по теме). как можно убить процесс системной консоли, с которой был запущен скрипт?
`kill -9 $$` убивает только выполнение скрипта.


Хмм, можно сделать grep на ps, для получения pid процесса шелла, например. Хотя, в таком случае, скрипт тоже умрёт, наверное, ибо child. Но, если запускать с "-nohup"... Напиши, что получится, вообщем. :)
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

mitya писал(а):
24.07.2006 16:44
Хмм, можно сделать grep на ps, для получения pid процесса шелла, например. Хотя, в таком случае, скрипт тоже умрёт, наверное, ибо child. Но, если запускать с "-nohup"... Напиши, что получится, вообщем. :)

Идея хорошая конечно, т.к. с помощью ps, grep, awk можно вычислить и убить pid, но проблема в другом: как узнать какой терминал именно убивать?=)
Тоесть мне нужно следующее: запускается скрипт и он убивает процесс системной консоли (вместе со скриптом, разумеется).
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: sh и глобальные переменные

Сообщение router »

soko1
Всё гораздо проще. exit
Ессно, если скрипт выполняется без вызова дочернего процесса
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

router писал(а):
24.07.2006 20:35
soko1
Всё гораздо проще. exit
Ессно, если скрипт выполняется без вызова дочернего процесса

=)))))
exit завершит работу скрипта, а мне надо чтобы завершалась сессия, с которой он был запущен.
Простой пример. Я сижу в 1-ой системной консоли. Запускаю скрипт:
%./test.sh
и после этого я logout'чусь...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: sh и глобальные переменные

Сообщение Liksys »

soko1 писал(а):
24.07.2006 21:30
router писал(а):
24.07.2006 20:35

soko1
Всё гораздо проще. exit
Ессно, если скрипт выполняется без вызова дочернего процесса

=)))))
exit завершит работу скрипта, а мне надо чтобы завершалась сессия, с которой он был запущен.
Простой пример. Я сижу в 1-ой системной консоли. Запускаю скрипт:
%./test.sh
и после этого я logout'чусь...

Можно попробовать использовать для этой цели $TERM
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: sh и глобальные переменные

Сообщение router »

soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт

Код: Выделить всё

#!/bin/sh
exit

на tty1

Код: Выделить всё

. test.sh

опаньки, logout ;)
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

router писал(а):
24.07.2006 22:19
soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт

Код: Выделить всё

#!/bin/sh
exit

на tty1

Код: Выделить всё

. test.sh

опаньки, logout ;)

Прошу прощения=) Невнимателен был я.
Спасибо!

Liksys писал(а):
24.07.2006 21:48
Можно попробовать использовать для этой цели $TERM
Как? Я уже знаю способ (благодаря router), но не помешает еще один.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: sh и глобальные переменные

Сообщение Liksys »

Этот способ несовершенен, первое, что прешло в голову. killall $TERM. Убивает все терминалы, похожие на родительский.
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: sh и глобальные переменные

Сообщение router »

Liksys писал(а):
24.07.2006 23:30
Этот способ несовершенен, первое, что прешло в голову. killall $TERM. Убивает все терминалы, похожие на родительский.

Хм... можно подробнее?

Код: Выделить всё

router@panzer:~$ echo $TERM
linux
router@panzer:~$ pgrep $TERM
router@panzer:~$ killall $TERM
linux: no process killed

В консоли, разумеется

добавлено:
Кажется, понял. Но это лишь для псевдотерминалов, а речь шла о консоли ?

добавлено:
Есть ещё способ.
Шелл, запущенный непосредственно логином, имеет префикс '-' c списке выдаваемом Консоль можно получить командой tty. Осталось только выделить pid и дать команду kill -9
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

router писал(а):
24.07.2006 23:38
добавлено:
Есть ещё способ.
Шелл, запущенный непосредственно логином, имеет префикс '-' c списке выдаваемом Консоль можно получить командой tty. Осталось только выделить pid и дать команду kill -9

Вот! Это то что и требовалось (забыл про существование команды `tty`).
Спасибо всем.
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

router писал(а):
24.07.2006 22:19
soko1
Вы предыдущие сообщения читали? Про команды "." и "source"
Запускаю скрипт

Код: Выделить всё

#!/bin/sh
exit

на tty1

Код: Выделить всё

. test.sh

опаньки, logout ;)

Не поверишь, но я попробовал и этот метод не прокатил=( Так что придется tty'ом...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: sh и глобальные переменные

Сообщение diesel »

soko1 писал(а):
26.07.2006 17:17
Не поверишь, но я попробовал и этот метод не прокатил=( Так что придется tty'ом...


ты точно скрипт запускал как

Код: Выделить всё

$ source test.sh
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

diesel писал(а):
29.07.2006 12:02
ты точно скрипт запускал как

Код: Выделить всё

$ source test.sh

Понимаешь, мне ж из скрипта нужно, а не из консоли. Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:

Код: Выделить всё

notebook$ sh test.sh
source: not found
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: sh и глобальные переменные

Сообщение diesel »

soko1 писал(а):
09.08.2006 22:26
Понимаешь, мне ж из скрипта нужно, а не из консоли. Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:

подожди .. тебе нужно чтобы твой основной shell-скрипт после завершения работы завершал сеанс ... так вот основной скрипт и запускай как source <script> и в нем допиши в конце exit .... или так не подходит?

Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:


нужно source <путь к файлу>, если что ...
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7

Re: sh и глобальные переменные

Сообщение soko1 »

diesel писал(а):
10.08.2006 00:52
soko1 писал(а):
09.08.2006 22:26

Понимаешь, мне ж из скрипта нужно, а не из консоли. Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:

подожди .. тебе нужно чтобы твой основной shell-скрипт после завершения работы завершал сеанс ... так вот основной скрипт и запускай как source <script> и в нем допиши в конце exit .... или так не подходит?

Когда из скрипта запускаю `source 1.sh` (скрипт 1.sh содержащит `exit`) вот что пишет:


нужно source <путь к файлу>, если что ...

Не, не катит это все=(
Сегодня придумал способ!!
Ставим утилиту skill и пишем в основном скрипте

Код: Выделить всё

skill -HUP `tty`

Так пашет. Но проблема еще одна: этот способ не пашет в иксах. Тоесть, если я запускаю скрипт из иксов - отказывается работать...ну да ладно, может что опять в голову придет...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: sh и глобальные переменные

Сообщение diesel »

Код: Выделить всё

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 и глобальные переменные

Сообщение soko1 »

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).
Спасибо сказали: