видимость переменных shell-а

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

видимость переменных shell-а

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

а не подскажет ли всемогущий all, где тут собака зарыта?

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

$ n=1 echo $n

$ n=1 bash -c 'echo $n'
1
$ n=1; echo $n
1
главное — почему в первой команде echo не видит значения $n?
если загрузить bash как чистый sh, картина та же самая. других оболочек под рукой нет. подозреваю, в них то же самое.
но какая-то потусторонняя сила подсказывает мне, что либо я жутко туплю, либо нарушаются законы здравой логики (:
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: видимость переменных shell-а

Сообщение t.t »

Интересные бывают находки при переносе старых тем в новый раздел. (: Особенно интересно, что так никто и не ответил.

Думаю, ты тогда всё-таки понял, в чём причина такой, на первый взгляд, странности, но вдруг ещё кому интересно будет..

Дело в том, когда происходит подстановка переменной, и кто эту переменную подставляет. И тут три принципиально разных случая.

Начну с конца.

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

n=1; echo $n

Здесь две команды. Первая задаёт переменную для текущей оболочки. При выполнении второй текущая же оболочка эту переменную и подставляет _перед_ вызовом самой команды.

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

n=1 bash -c 'echo $n'

В этом случае всё ровно наоборот. Это одна команда. Переменная задаётся не для текущей оболочки, а конкретно для этой команды. Сама переменная закавычена; следовательно, кавычки обрабатываются текущей оболочкой, а переменная достаётся дочерней _неподставленной_ -- и уже та нормально её подставляет: для неё-то переменная задана.

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

n=1 echo $n

Думаю, тут уже всё понятно из предыдущих объяснений. Переменная здесь, как и во втором рассмотренном случае, передаётся только дочернему процессу -- текущей оболочке она недоступна. Но подстановку-то здесь производит именно текущая оболочка. Потому на выходе и пусто.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: видимость переменных shell-а

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

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

Re: видимость переменных shell-а

Сообщение t.t »

sash-kan писал(а):
15.10.2009 18:32
да, раскопки иногда дают интересные результаты.
кстати, в этот же новый раздел можно добавить: перенаправление потока и переменная окружения
Спасибо. Перенёс.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: