我有一个java program
我正在从stdin中读取
BufferedInputStream bis = new BufferedInputStream(System.in);
byte[] b = new byte[1];
int cmd = bis.read(b);
System.out.println("Read command: " + new String(b));
并shell script
开始停止此计划
'start')
if [ -p myfifo ]; then
rm myfifo
rm myfifo-cat-pid
fi
mkfifo myfifo
cat > myfifo &
echo $! > myfifo-cat-pid
java -jar lib/myJar.jar >/dev/null 2>&1 0<myfifo &
echo `date +%D-%T` $! >> process.pid
echo "Started process: "$!
;;
'stop')
echo 0 > myfifo
echo "Stopped process: "
rm myfifo
;;
当我逐个启动命令时,程序会一直等到我在fifo上回显。但是当我从.sh文件运行它时,它立即从stdin读取。不明白如果直接在命令提示符下运行命令和我是否生成.sh文件并运行它之间有什么区别
答案 0 :(得分:1)
区别在于Java
方面,而是在启动脚本时shell处理不同的作业控制。来自man bash
:
JOB CONTROL
Job control refers to the ability to selectively stop (suspend) the
execution of processes and continue (resume) their execution at a later
point. A user typically employs this facility via an interactive
interface supplied jointly by the operating system kernel's terminal
driver and bash.
正如here所述,默认情况下,脚本中禁用了作业控制。
当在交互式shell中执行cat > myfifo &
时,它将保持“已停止”模式,等待再次置于前台(使用fg
)。在脚本中启动时,相反,作业控制被禁用,因此,只要cat
尝试从(分离的)终端读取它,它就存在,关闭管道(并且您的Java
进程读取{{ 1}})。
如果您在shell脚本的顶部使用EOF
(因此强制执行作业控制),您应该会看到一致的行为。
set -m