Поведение функции в сценарии оболочки (ksh) - PullRequest
0 голосов
/ 29 ноября 2011

Здесь представлены 2 разные версии программы:

это

Программа:

#!/usr/bin/ksh

printmsg() {
        i=1
        print "hello function :)";
}
i=0;
echo I printed `printmsg`;
printmsg
echo $i

Выход:

# ksh e
I printed hello function :)
hello function :)
1

и

Программа:

#!/usr/bin/ksh

printmsg() {
        i=1
        print "hello function :)";
}
i=0;
echo I printed `printmsg`;
echo $i

Выход:

# ksh e
I printed hello function :)
0

Единственная разница между вышеупомянутыми 2 программами состоит в том, что printmsg 2 раза в вышеуказанной программе, тогда как printmsg вызывается один раз в следующей программе.

У меня возникает сомнение здесь: Цитировать

Имейте в виду: функции действуют почти так же, как внешние сценарии ... за исключением что по умолчанию все переменные делятся между одним и тем же ksh процесс! Если вы измените имя переменной внутри функции .... это значение переменной все равно будет изменено после того, как вы покинете функция !!

Но мы можем ясно увидеть в выходных данных 2-й программы, что значение i остается неизменным. Но мы уверены, что функция вызывается, поскольку оператор print получает выходные данные функции и печатает ее. Так почему же выходные данные различны?

1 Ответ

2 голосов
/ 29 ноября 2011

Когда вы используете обратные метки (или $ (...)), вы выполняете его в подоболочке.

То есть запускается новая оболочка (которая наследуется от текущей) и затем существует.

Редактировать: Я проверил вашу ссылку , если вы прочитаете нижнюю часть, самый последний раздел, вы увидите это объяснение.

...