bash中的read命令不会在与不同用户的操作中等待

时间:2014-03-04 10:41:47

标签: bash shell

我正在通过bash B中的不同用户调用bash A,我希望卡在线“ * ”直到用户输入“exit”。

# bash B
su test<<endOfTestOperation
./bashA.sh
endOfTestOperation

# bash A
# Start a process &
read LINE            <------ I want to wait here until user inputs "exit"
if [ "$LINE" == "exit" ]; then
    # end the process 
    exit
fi 

如果我只调用bash A,它可以正常工作。如果我在“endOfTestOperation”之后加上“read”,它也可以。所以我猜这个问题源于使用不同的权限或分叉进程。

[补充说明] 我要做的是:启动一个tcpdump(需要root权限,所以使用sudo运行bash b),然后启动tcpserver进程,然后在stdin中要求用户输入时结束tcpserver。

2 个答案:

答案 0 :(得分:1)

您正在从此处的文档重定向su的标准输入。 su运行的命令将从su继承标准输入,因此它也是这里的文档,而不是终端。由于su在读取要运行的命令时会占用整个here文档,因此bashA.sh无法读取任何内容,因此read命令会立即失败而不是等待输入。

如果您需要解决方法,则需要发布有关实际尝试的更多详细信息。

答案 1 :(得分:0)

使用if语句不会继续检查输入是否为“退出”,它只会检查一次。

您可以使用until循环来确保用户输入“退出”。

您可以使用$!找到发送到后台的最新命令的过程。

background command &
pid=$!
until [[ $LINE == exit ]]; do
    read LINE
done && { kill -9 $pid; exit; }