我正在通过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。
答案 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; }