Bash Unix Shell Script для принятия ввода и установки системных переменных - PullRequest
2 голосов
/ 12 марта 2012

Я пытаюсь изменить существующий сценарий оболочки, чтобы он принимал пользовательский ввод и обрабатывал некоторые системные экспорты. Ниже приведен отрывок из более крупного сценария. После запуска этого скрипта я отображаю $ TEST_DIR и ничего не получаю обратно. Есть идеи?

#!/bin/sh

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
    exit 1
fi

Ответы [ 3 ]

3 голосов
/ 12 марта 2012

Сохранить как script.sh.

#!/bin/bash

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
fi

И запустите это так:

. ./script.sh

Или, что эквивалентно:

source ./script.sh

source запускает сценарий в текущей среде и, следовательно, позволяет изменять среду в сценарии. Без этого каждой команде, которая выполняется как дочерний процесс процесса оболочки, предоставляется только копия текущей среды.

Примечание. Я удалил строку exit, так как в этом случае она будет завершать оболочку.

1 голос
/ 12 марта 2012

Вы, вероятно, не хотите делать exit 1;это используется для обозначения сбоя.Вы бы использовали exit 0 для обозначения успеха - но, как описано ниже, в этом случае вы тоже не хотите этого делать.

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

Чтобы обойти это, в оболочках POSIX вам необходимо использовать:

. your_script.sh

или, в bash, вы можететакже используйте:

source your_script.sh

Сценарий не обязательно должен быть исполняемым, просто читаемым, и его нужно искать в $PATH, если вы не укажете имя, содержащее косую черту, как и другие команды.

И, когда вы делаете . или source, вы определенно не хотите, чтобы exit в сценарии, потому что это приведет к закрытию основной оболочки.Оболочка читает файл так, как если бы вы набирали его при стандартном вводе (более или менее), поэтому выполнение exit приведет к выходу из оболочки.

1 голос
/ 12 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...