如何让Bash脚本中的命令输出到前台而非后台运行
解决Bash脚本中sngrep后台运行的问题
我之前也碰到过类似的坑!像sngrep这种交互式终端程序,在脚本里执行时很容易因为终端关联丢失跑到后台,给你几个亲测有效的解决方案:
1. 强制绑定当前终端执行
如果脚本里只需要运行sngrep,直接用exec替换当前shell进程,让sngrep完全接管前台:
#!/bin/bash exec sngrep [你的参数]
如果脚本还有前置逻辑要处理,就先获取当前终端设备,把sngrep的输入输出直接绑定到这个终端:
#!/bin/bash # 这里放你的前置操作,比如环境检查、参数处理等 CURRENT_TTY=$(tty) # 强制让sngrep读写当前终端 sngrep [你的参数] < "$CURRENT_TTY" > "$CURRENT_TTY" 2>&1
2. 用setsid强制前台等待
有些情况下,脚本的子进程会因为会话组问题被后台化,setsid的-w参数可以强制等待命令执行完成,把sngrep锁在前台:
#!/bin/bash setsid -w sngrep [你的参数]
3. 检查脚本的执行方式
别忽略最基础的点:如果你是用./your_script.sh &这种后台方式启动脚本,那不管里面怎么写都会跑到后台。一定要直接用./your_script.sh前台执行脚本,或者在其他脚本调用时不要加&后缀。
补充:关于Screen的正确用法
如果你坚持想用Screen,试试让Screen直接在当前终端启动sngrep而不是后台会话:
#!/bin/bash screen -S sngrep_session sngrep [你的参数]
这样运行脚本后,Screen会直接接管当前终端前台,退出sngrep后会自动回到脚本上下文。
你可以先试试第一种exec的方法,这是最直接有效的方案,我当时就是靠它解决了同样的问题。
内容的提问来源于stack exchange,提问作者Kismet Agbasi
相关产品推荐
相关产品推荐

