LINUX.ORG.RU

Bash: Как вернуть назад параметр


0

1

я новичек, поэтому если есть более оптимальтый способ-- скажите, (с целью разгрузить тело скрипта от повторяющегося кода, выделяю его в отдельный файл «библиотеку») передаю параметр скрипту: bash «/tmp/123» param

/tmp/123 #!/bin/bash ccc=«$1» exit 0

после завершения скрипта, пишу в консоли echo «$ccc», ожидая что раз в дочернем скрипте была обьявлена переменная ссс, то и в родительском скрипте (в данном случае терминале) она будет видна. этого не происходит. как это можно исправить?

Когда ты дергаешь дочерний скрипт, он открывается в subshell.
Следовательно, из него ты переменные не передашь.

tazhate ★★★★★ ()

Зачем вам это нужно ?

Если вам нужно выставлять значение некоторых переменных, определённых заранее в файла, то нужно (можно) делать так:
1. В начале создать файл, в котором будут определены переменные

vat1=a
var2=b
var4=c
2. Выставить значения переменных в соответствие с файлом:
$ source file
или
$ . file
Теперь у вас будут определены переменные в вашей оболочке:
$ echo $var1
a
$ echo $var2
b
$ echo $var3
c

А так при выполнении скрипта запускается отдельный интерпретатор. Но вы можете поступить по аналогии, в скрипте выводить нужные значения в файл, а после выполнения скрипта их выставлять.

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

Неправильная логика. Всё, что было объявлено в локальном скрипте уничтожается после его завершения. Всё, что было объявлено в родителе, доступно всем детям.

В твоём случае надо подключать файл с переменными/повторяющимися функциями в основном скрипте так

source /path/to/file.sh
или вот так
. /path/to/file.sh

shell-script ★★★★★ ()
Ответ на: комментарий от qwertyqw

Почитайте http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshell...

Variables in a subshell are not visible outside the block of code in the subshell. They are not accessible to the parent process, to the shell that launched the subshell. These are, in effect, local variables.

Ну и моё сообщение выше Bash: Как вернуть назад параметр (комментарий) или сообщение Bash: Как вернуть назад параметр (комментарий) .

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

правильно ли я понял, что вернуть параметры из скрипта, я могу только через файл на HDD?? а есть ли более быстродействующий способ?

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

Вы это прочитали:

Variables in a subshell are not visible outside the block of code in the subshell. They are not accessible to the parent process, to the shell that launched the subshell. These are, in effect, local variables.
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshell...

Переведите, если вам не понятно.

Зачем вам возвращать значение переменной в ваш интерпретатор ?

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

Хм, перевод, как я понимаю, такой: Переменные в дочерней оболочке не видимы снаружи этой оболочки, они недоступны для родительского процесса. Они локальные переменные.

У меня задача: есть скрипт (в котором много раз повторяется один и тот же кусок кода, почти без изменений) Этот кусок кода получает 4 переменные (обрабатывает их, и выдает в виде ответа одну переменную)

Так вот: 1)Этот кусок кода большой, и очень мешает читать остальной код, поэтому я хочу выделить его в отдельный модуль(если это возможно, соответственно, ему надо как-то передать параметры, и получить от него ответ) 2) желательно сделать это не через файл, т.к. обращение к винчестеру будет частым

qwertyqw ()

а не проще запилить 1 функцию и все дубли заменить на вызов этой функции с нужными параметрами?
и если таки хочешь в родителя перетащить переменную из дочки, то почему бы в внешнем_скрипте не выводить результат овер echo?
ну а в родителе делать что-то типа

ccc="$(скрипт парам пам пам)"

megabaks ★★★★ ()
Последнее исправление: megabaks (всего исправлений: 2)
Ответ на: комментарий от qwertyqw

ему надо как-то передать параметры, и получить от него ответ

cat script.sh

#!/bin/bash
param=$@
echo "Ты передал скрипту параметры: $param"

cat main_script.sh

#!/bin/bash
resp=`~/script.sh TEST`
echo "$resp"

Выполняем:

$ ./main_script.sh 
Ты передал скрипту параметры: TEST
alozovskoy ★★★★★ ()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от megabaks

То есть ТС бы твой ответ распарсил? Когда человек говорит что он новичек я считаю нужно как можно точнее все показать.

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

нужно как можно точнее все показать.

ок, тогда почему я не вижу экранирования и всяких { } вокруг переменных?

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

Что именно? Вот это?

On invocation, the shell scans its own environment and creates a parameter for each name found, automatically marking  it  for
       export to child processes.

shell-script ★★★★★ ()
Ответ на: комментарий от qwertyqw

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

это невозможно.

1. Можно сделать в том же скрипте функцию, и передавать ей параметры (кстати bash умеет ещё и локальные параметры, а по умолчанию они гнлобальные, по всему скрипту)

2. Один скрипт можно разделить на несколько файлов, и включать другие файлы командой source или точкой ".". Надо понимать, что это не аналог «библиотеки», а просто файл внутри файла. Т.е. с т.з. интерпретатора это один большой скрипт.

3. Можно вызывать дочерние скрипты, но передавать параметры можно только ТУДА (см. export). Обратно вы получаете только код возврата, которые лучше всего делать 0 (успех) или 64..127 (ошибка).

emulek ()
Ответ на: комментарий от qwertyqw

правильно ли я понял, что вернуть параметры из скрипта, я могу только через файл на HDD?? а есть ли более быстродействующий способ?

есть, через стандартный вывод.

в библиотеке:

echo "result"
exit 0

вызываем:

var="$(bash /tmp/123)"

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

чушь не пори, ей больно.

Всё нормально, сегодня официальный день тупняка на ЛОРе. Чуше вкололи обезброливающее.

anonymous ()
Ответ на: комментарий от emulek

задача решена. (воспользовался советом об использовался функций.) также утащил в свою копилку рецепт подключения скриптов и обмена параметрами всем высказавшимся спасибо

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

вернуть параметры из скрипта, я могу только через файл на HDD?

Ты можешь просто вывести эти параметры эхом, забрать в пайп и ковырять как угодно дальше

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

из них можно получать не только коды завершения

я знаю. Кофе и минет. Но я про переменные говорил. Извини, мы не поняли друг друга. Файлы тоже можно конечно.

emulek ()
Ответ на: комментарий от qwertyqw

Если бы он временно на диск скидывался, линукс помер бы давно - это представь все костыли сисадминов, юзеров и энтузиастов данные между собой на нжмд пишут/затирают?

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

уважаемый, чему людей учишь? Какой диск? Файл разве обязан быть на диске? Pipe == файл, хоть и не «на диске». Он может даже быть безымянным, но всё равно будет файлом.

ЗЫЖ сейчас пишу с системы, в которой уже давно нет никаких «дисков», и даже ssd нет. Брат жив. А windows must die.

emulek ()
Ответ на: комментарий от megabaks

дык я-то спокоен, это ты что-то разнервничался. Хотя я не совсем понял, что тебя так расстроило.

Ясное дело, что в Linux всё — файлы, и очевидно, что разные процессы могут ими меняться. Ну а твоё «ну никак», это просто нервы.

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

эм...это не нервы.
ты просто обнулил контекст, в котором под файлом подразумевались данные записанные на диск.
у тебя то ли кэш маловат и весь контекст не влезает, то ли ты просто решил пофлудить.

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

Обратно вы получаете только код возврата

чушь не пори, ей больно.

ты просто обнулил контекст

я? А мне кажется, это ты обнулил контекст.

Я могу его(контекст) процитировать, мне не лень: «после завершения скрипта, пишу в консоли echo «$ccc», ожидая что раз в дочернем скрипте была обьявлена переменная ссс, то и в родительском скрипте (в данном случае терминале) она будет видна. этого не происходит.»

Вот теперь и объясни, что в этом контексте ты подразумевал под «чушью»?

emulek ()
Ответ на: комментарий от megabaks

таки у тебя кэш маловат

у тебя. Я цитировал _первый_ пост, и отвечал на него и в его контексте. А ты(с minkov'ым) уже _потом_ придумал какие-то пайпы, про которых ТС и не интересовался. И отвечал ты мне в _своём_ контексте, а не в моём и не в контексте ТСа.

Я прекрасно помню твой контекст, но таки всё пытаюсь безуспешно вернуть тебя к тому контексту, который тут обсуждается. А если ты желаешь обсудить вопрос связанный с пайпами, то я не против, открывай тему с удовольствием обсудим.

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

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

minakov ★★★★★ ()
Последнее исправление: minakov (всего исправлений: 1)
Ответ на: комментарий от emulek

это тебе надо было заметить - я таки после решения просто отвечал на ТВОИ посты...

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

Не, сливаешь ты, а тебя аргументированно тыкают в твоё же говнецо

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

Явно же видно - стоит только к окулисту сходить и внимательно, может тренинги посетишь по фиксации мыслей?, перечитаешь тред....

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

а есть нафлудивший слившийся эмулек с альтернативным мышлением?

в каком месте я «слившийся»?

Явно же видно - стоит только к окулисту сходить и внимательно, может тренинги посетишь по фиксации мыслей?, перечитаешь тред....

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

Ок, запишу тебя в демагоги, заслужил.

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