如何实现打开终端执行命令后自动关闭,且仅在命令执行成功时关闭?
如何实现打开终端执行命令后自动关闭,且仅在命令执行成功时关闭?
我明白你的需求啦——打开foot终端,输入一条命令,要是命令执行成功就自动关掉终端,失败的话就留在原地方便排查问题(比如打错命令、忘了加sudo这类情况)。你之前尝试的写法主要卡在命令时机不对和引号转义/变量展开错误上,我给你两个靠谱的解决方案:
方案1:显式判断命令退出码
用read读取终端输入的命令,执行后判断退出码是否为0(成功的标志),再决定是否关闭终端:
exec foot sh -c 'read -p "Enter command: " cmd; eval "$cmd"; [ $? -eq 0 ] && exit'
read -p "Enter command: " cmd:在终端里显示提示语,等待你输入命令并保存到cmd变量eval "$cmd":执行你输入的命令(能正确处理带空格、管道、重定向的复杂命令)[ $? -eq 0 ] && exit:检查上一条命令的退出码,只有成功(退出码0)才执行exit关闭终端,失败则留在shell里
方案2:用逻辑运算符简化写法
利用shell的&&逻辑(仅前面命令成功时才执行后面命令),写法更简洁:
exec foot sh -c 'read -p "Command: " cmd; eval "$cmd" && exit'
这个逻辑和方案1完全一致,只是把判断和退出合并成了一行,更清爽。
额外小提示
- 要是不需要提示语,把
-p "Enter command: "去掉就行,变成read cmd - 输入需要
sudo的命令也完全没问题,比如输sudo apt update,密码输对且命令执行成功就会自动关终端;密码输错或者命令失败,终端会保留下来让你重试
为什么你之前的写法没生效?
比如你试的exec foot sh -c "read line | sh":这个是把输入的命令传给sh执行,但不管命令成功失败,sh执行完就会退出,终端也就跟着关了,没法实现“失败留着”的需求;
而exec foot sh -c "output=$(read line); sh -c $output"的问题是,$(read line)会在启动foot终端之前就执行,根本不会在打开的终端里等待你输入命令,自然达不到预期效果。
备注:内容来源于stack exchange,提问作者Mahoni
相关产品推荐
相关产品推荐

