Задать вопрос
@Alexey_Shalin

Как передать переменную из одного скрипта в другой в bash?

Добрый день
При помощи pdmenu я построил некое меню с такими пунктами
Search User by ID:: sudo /scripts/firewall search_id
View User::sudo /scripts/firewall view_user

Запускается меню при помощи команды pdmenu.
Итак, суть проблемы такая.

Когда некий юзер заходит в меню - он вызывает Search User by ID находит определенного юзера. Соответственно у юзера есть ID -> пускай это будет 5000. Юзер выбрал это значение и оно записалось в переменную client_id

Далее хотелось бы, чтобы при выборе в меню пункта View User значение client_id было известно, т.е. бралось из первого шага

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

Как можно передать переменную?

ОС FreeBSD
  • Вопрос задан
  • 10967 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@comAT0Zz
Следим за мыслью..
1.sh source:
#!/bin/bash
MY_USER_ID=5000
./2.sh $MY_USER_ID


2.sh source:
#!/bin/bash
echo $1
Ответ написан
Комментировать
@Alexey_Shalin Автор вопроса
Немного не то, о чем я пишу выше
Вариант есть другой
. ./1.sh
. ./2.sh
тогда да, окружение export будет одинаковое .. но я не могу вызвать скрипт таким образом из pdmenu

вот как формируется меню
#!/usr/local/bin/pdmenu
#
# Note that the above bang-path isn't required, but it lets you run this
# file directly as a sort of pdmenu script.

# Sample menus for Pdmenu.

# Define the main menu.
menu:main:Main Menu
        show:_Search Client..::findclient
        show:_Clients...::clients
        show:_Tools...::tools
        nop
        exit:_Exit

menu:findclient:Find Client:Find Client
        exec:_Find by ID:: sudo /root/scripts_new/firewall select_id
        exec:_Find by Name::sudo /root/scripts_new/firewall select_name
        exec:_Find by IP::sudo /root/scripts_new/firewall select_ip
        exec:_Find by Pipe::sudo /root/scripts_new/firewall select_pipe
        nop
        exit:_Main menu..
menu:clients:Clients:Clients
        exec:_Add new Client:: sudo /root/scripts_new/firewall new_client
        exec:_View Client:: sudo  /root/scripts_new/firewall view_client
        exec:_Edit Client::sudo /root/scripts_new/firewall edit_client
        exec:_Delete Client::sudo /root/scripts_new/firewall delete_client
        nop
        exit:_Main menu..
menu:tools:Tools:Tools
exec:_Trafshow on em0::sudo /usr/local/bin/trafshow -i em0
exec:_Trafshow on em1::sudo /usr/local/bin/trafshow -i em1
nop
exit:_Main menu..

вызов из шела
pdmenu pdmenurc
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Менять окружение родительского процесса не получится.
Но можно сделать следующим образом: завести временный файл с настройками, выполненный в виде шелл-скрипта, изменять его из вызываемых скриптов и подгружать его в запускаемые скрипты при старте. Наример так:

основной скрипт (запускает pdmenu, который дальше запускает 1.sh и 2.sh):
CONF=`mktemp`
export CONF
...
pdmenu pdmenurc
...
rm -f "${CONF}"


1.sh (изменяет VAR):
. "${CONF}"
...
sed -i "${CONF}" -e "/^VAR=/d"
echo "VAR=\"${new_var_value}\"" >> "${CONF}"
...


2.sh (выводит VAR изменённый в 1.sh):
. "${CONF}"
...
echo "${VAR}"
...
Ответ написан
Комментировать
@Alexey_Shalin Автор вопроса
сделал так
cat start.sh
#!/usr/local/bin/bash
export CONF=`mktemp`
pdmenu /root/scripts_new/pdmenurc
rm -f "${CONF}"


в pdmenurc
exec:_test::sudo /root/scripts_new/1.sh
        exec:_test2::sudo /root/scripts_new/2.sh


cat  /root/scripts_new/1.sh
#!/usr/local/bin/bash
. "${CONF}"
export K=1
export


резалт
/root/scripts_new/1.sh: line 2: : No such file or directory - это на строку . "${CONF}"
и при выполении export в 1.sh нет переменной CONF
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы