我正在尝试修改现有的shell脚本以接受用户输入并处理一些系统导出。以下是较大脚本的摘录。运行此脚本后,我回显$ 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
答案 0 :(得分:3)
将其另存为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
在当前环境中运行脚本,因此允许您在脚本中修改环境。没有它,每个作为shell进程的子进程运行的命令只会获得当前环境的副本。
注意我删除了exit
行,因为它会在这种情况下终止shell。
答案 1 :(得分:1)
问题是你在子shell中运行脚本 - 它正确地设置你的TEST_DIR
,但是shell退出了,而且父shell没有保留更改。
你可能最好将这个功能从父shell中获取。 Shell脚本不能修改调用shell的环境,但是函数可以修改它正在执行的shell。
答案 2 :(得分:1)
您可能不想exit 1
;用来表示失败。您可以使用exit 0
来表示成功 - 但是,如下所述,在这种情况下,您也不希望这样做。
另一个问题是,如果您将脚本作为子进程运行,则它不会影响父进程的环境。
要解决此问题,在POSIX shell中,您需要使用:
. your_script.sh
或者,在bash
中,您还可以使用:
source your_script.sh
脚本不必是可执行的,只是可读的,并且将在$PATH
上搜索,除非您指定包含斜杠的名称,就像其他命令一样。
而且,当您执行.
或source
时,您肯定不希望脚本中有任何exit
,因为这会导致主shell退出。 shell读取文件就像您在标准输入(或多或少)中键入它一样,因此执行的exit
将退出shell。