Linux Dialog与except使用示例用法

文章介绍了如何在Linux命令行界面使用dialog工具创建各种图形组件,如提示框、输入框和进度条等,并提供了相关示例代码。同时,文章也讲解了Expect工具,用于自动化交互式任务,包括SSH连接和条件判断,展示了如何通过脚本传递参数和控制流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dialog 简介

  1. 1993年0.1版本推出仅支持 --inputbox --msgbox --yesno三个组件
  2. whiptail 和dialog 一样用于cli图形组件显示,两者语法几乎一致,只是底层依赖库完全不同
  3. zenity 是基于gtk的gui界面的图形组件
  4. kdialog 是基于kde的gui界面图形组件

dialog实例代码

msgbox(提示框)

#!/bin/bash

function msgbox(){

	local title
	local content

	title="${1}"
	content="${2}"

	dialog \
	--title "${title}" \
	--msgbox "${content}" \
	10 50
}

msgbox "this is msg" "Hello word!"

tailbox(信息展示框)

#!/bin/bash

function textbox(){

	local title
	local filepath

	title="${1}"
	filepath="${2}"

	dialog \
	--title "${title}" \
	--textbox "${filepath}" \
	10 50
}

textbox "this is file content" /etc/os-version

input(用户输入框)

#!/bin/bash

function input(){

	local info

	info="$(dialog \
	--stdout \
	--inputbox 'Please input some info:' \
	10 50)"

	clear
	echo -e "Input info is:\n\n\t${info}\n"
}

input 

passwd input(密码输入框)

#!/bin/bash

function passwd_input(){

	local passwd

	passwd="$(dialog \
	--stdout \
	--insecure \
	--passwordbox 'Please input passwd:' \
	10 50)"

	clear
	echo -e "Input passwd is:\n\n\t${passwd}\n"
}

passwd_input 

yes no(询问框)

#!/bin/bash

function yes_no(){

	dialog \
	--title "yes/no" \
	--yesno "Please choose yes or no" \
	10 30
	return_code="$?"
	clear

	return ${return_code}
}

yes_no
OPTION=${?}
case "${OPTION}" in 
	0)
		state="YES"
		;;
	1)
		state="NO"
		;;
	255)
		state="QUIT"
		;;
esac

echo -e "\n\nYou choosed:\n\n\t${state}\n"

file select(文件选择框)

#!/bin/bash

function fselect(){

	local filepath

	filepath="$(dialog \
	--stdout \
	--fselect '/home/' \
	15 50)"

	clear
	echo -e "File path is:\n\n\t${filepath}\n"
}

fselect 

progress(进度条)

#!/bin/bash

function progress(){

	dialog \
	--title "this is progress" \
	--progressbox \
	15 50
}

{
	for ((i=0;i<100;i++));do
		echo -e "\nThis is test"
		sleep 0.5
	done
}|progress

program(文本过程展示)

#!/bin/bash

function programbox(){

	dialog \
	--title "this is progress" \
	--programbox \
	15 50
}

{
	for ((i=0;i<10;i++));do
		echo -e "\nThis is test"
		sleep 0.5
	done
}|programbox

gauge(进度条2)

#!/bin/bash

function gauge(){

	dialog --gauge "this is gauge" \
	10 50
}


action=(\
	"sleep 1"\
	"sleep 1"\
	"sleep 1"\
	"sleep 1"\
	)
let progress=(100/${#action[*]})
{
	state=0
	for (( i = 0; i < ${#action[*]}; i++ )); do
		bash -c "${action[${i}]} >/dev/null 2>&1"
		echo "${progress}"
		let progress=progress+100/${#action[*]}
	done
}|gauge

menu(菜单)

#!/bin/bash

function menu(){

	OPTION=$(\
		dialog\
		--backtitle "Main menu V0.1"\
		--title "--Menu--"\
		--stdout \
		--ok-label OK\
		--cancel-label EXIT\
		--menu "" 15 30 $((${#MAINMENU[*]}/2+2))\
		"${MAINMENU[@]}"
	)
	return ${?}
}

MAINMENU=(\
	"1" "show msg box"\
	"2" "show text box"
	"3" "show input box"\
	"4" "show passwd box"\
	"5" "show yes & no box"\
	"6" "show file select box"\
	"7" "show program box"\
	"8" "show gauge box"\
	)

menu

expect简介

Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它,系统管理员可以创建脚本来对命令或程序进行输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现简单的BBS聊天机器人。 😃
Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

expect实例代码

自动连接多个远程ssh

#!/bin/bash

IP_LIST=(
	127.0.0.1
	10.8.12.102
	10.8.12.103
	127.0.0.1
	)

USER_NAME="uos"
PASSWD="Unit@123"

for ((i=0;i<${#IP_LIST[*]};i++)); do
	expect <<EOF
	set timeout 1
	spawn ssh ${USER_NAME}@${IP_LIST[i]}
	expect {
		"*yes/no" { send "yes\r"; exp_continue }
		"*password:" { send "${PASSWD}\r" }
	}
	expect -re ".*\[\$#\]" {
		send "df -h\r"
	}
	expect eof
EOF
done

expect脚本传递参数

#!/usr/bin/expect

set timeout 2
set username [lindex $argv 0]  
set password [lindex $argv 1]  
set hostname [lindex $argv 2]  

puts "name --> $username"
puts "passwd --> $password"
puts "ip addr --> $hostname"
puts "----------------------\n"

spawn ssh ${username}@${hostname} 
expect "yes/no" { send "yes\r"; exp_continue } 
expect "password:" { send "$password\r" }
  
expect eof  

expect if判断

#!/usr/bin/expect

set arg_a "1"
set arg_b "2"

puts "p1 --> ${arg_a}"
puts "p2 --> ${arg_b}"


if { $arg_a > $arg_b } {
	puts "p1 great than p2"

} elseif { $arg_a < $arg_b } {
	puts "p1 less than p2"

} else {
	puts "p1 equal p2"
}

except for

#!/usr/bin/expect

for { set i 0 } { $i < 10 } { incr i} {
	sleep 0.5
	puts "print i --> $i"
}

except while循环

#!/usr/bin/expect

set arg_i 0

while { true } {
	puts "print arg_i --> $arg_i"
	incr arg_i 1

	if { $arg_i > 10 } {
		puts "--end--"
		break
	}
}
<think>我们正在处理一个关于深度学习网络端口对象缺失的错误。用户遇到了一个对话框无法打开的问题,错误提示是“deep learning network port object missing error”。根据用户描述,这似乎是一个网络端口配置或对象初始化相关的错误。 由于这是一个具体的错误,我们需要考虑可能的原因: 1. 软件依赖问题:可能缺少必要的库或组件。 2. 配置问题:网络端口配置不正确,或者对象初始化失败。 3. 代码问题:在创建或使用端口对象时存在错误。 根据引用[1]中提到的,有一些专门处理文本的库,但我们的问题似乎网络端口对象有关,因此可能涉及网络编程或深度学习框架的底层通信。 引用[2]提到了一些跟踪算法,但这里可能不直接相关。 引用[3]介绍了controlnet tile的用法,这属于图像生成领域,当前问题无关。 因此,我们需要从深度学习框架的网络通信角度来考虑。 常见的深度学习框架如TensorFlow、PyTorch等,在分布式训练或模型服务时会使用网络端口。如果出现端口对象缺失的错误,可能是由于以下原因: - 端口被占用或无法绑定。 - 网络配置对象(如socket)没有正确初始化。 - 框架的某些组件未安装或版本不匹配。 解决步骤建议: 1. 检查端口占用情况:使用命令行工具(如`netstat`)查看目标端口是否已被占用。 2. 重新初始化网络对象:确保在代码中正确创建了端口对象,并进行了必要的配置。 3. 更新或重新安装框架:确保使用的深度学习框架是最新版本,并且所有依赖都已安装。 如果用户提供了更具体的上下文(如使用的框架、代码片段等),我们可以给出更精确的指导。 由于用户的问题描述比较简短,我们可能需要进一步询问细节。但根据现有信息,我们提供以下一般性解决方案: **解决方案步骤:** 1. **检查端口占用情况**: 在命令行中运行(以Linux为例): ```bash netstat -tuln | grep <端口号> ``` 如果端口被占用,可以尝试更换端口或关闭占用该端口的进程。 2. **检查代码中网络对象的初始化**: 确保在代码中正确创建了网络端口对象。例如,在TensorFlow中,创建`tf.distribute.Server`时需要指定正确的端口。 3. **检查防火墙设置**: 防火墙可能会阻止端口的使用,确保端口在防火墙中是开放的。 4. **更新框架和依赖**: 使用以下命令更新框架(以TensorFlow为例): ```bash pip install --upgrade tensorflow ``` 5. **查看框架的日志信息**: 通常框架会输出更详细的错误信息,根据日志进一步排查。 6. **重新安装框架**: 如果上述方法无效,尝试重新安装框架。 如果问题仍然存在,请提供更多信息,例如: - 使用的深度学习框架和版本。 - 出现错误的完整代码(如果可能)。 - 完整的错误堆栈信息。 这样我们可以更准确地定位问题。 相关问题: 1. 如何检查Linux系统中端口的使用情况? 2. TensorFlow分布式训练中如何正确配置端口? 3. PyTorch分布式训练常见错误有哪些? 4. 如何查看和关闭占用某个端口的进程? 5. 深度学习框架中网络通信的基本原理是什么?</think>### 解决深度学习网络端口对象缺失错误 当出现"deep learning network port object missing error"导致对话框无法打开时,通常是由于网络端口配置异常或对象初始化失败引起的。以下是系统化的解决步骤: #### 1. **检查端口占用冲突** - 使用命令查看端口占用情况: ```bash netstat -ano | findstr :<端口号> # Windows lsof -i :<端口号> # Linux/Mac ``` - 若端口被占用: - 结束冲突进程:`taskkill /PID <进程ID> /F`(Windows)或 `kill -9 <进程ID>`(Linux/Mac) - 或在代码中修改默认端口(如TensorFlow的`TF_CONFIG`或PyTorch的`init_process_group`端口) #### 2. **验证依赖库完整性** - 重新安装核心网络库: ```bash pip uninstall -y tensorflow torch && pip install --no-cache-dir tensorflow torch ``` - 检查CUDA/cuDNN版本兼容性(关键!): ```bash nvcc --version # CUDA版本 torch.__version__ # 查看PyTorch支持的CUDA版本 ``` #### 3. **对象初始化修复** - 在代码中添加显式对象检查: ```python import socket try: # 示例:创建TCP端口对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("localhost", 12345)) except OSError as e: print(f"端口对象创建失败: {e}") # 添加备用端口或自动回收逻辑 ``` #### 4. **防火墙权限配置** - 临时禁用防火墙测试: ```bash systemctl stop firewalld # Linux netsh advfirewall set allprofiles state off # Windows ``` - 以管理员权限运行程序(Windows需右键选择"以管理员身份运行") #### 5. **调试工具诊断** - 使用Wireshark监控网络流量 - 启用框架的详细日志: ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0' # TensorFlow全量日志 os.environ['NCCL_DEBUG'] = 'INFO' # PyTorch分布式日志 ``` > ⚠️ **注意**:若使用Docker容器,需确保端口正确映射:`docker run -p 主机端口:容器端口 ...` ### 相关问题 1. 如何检测深度学习框架中的端口冲突? 2. PyTorch分布式训练出现`Address already in use`错误如何解决? 3. TensorFlow Serving服务启动时端口绑定失败的处理流程? 4. 如何为深度学习服务配置安全端口规则? 5. CUDA版本深度学习框架不兼容会导致哪些网络层错误? [^1]: Libraries that specialize in processing text. CogCompNLP- Provides common annotators for plain text input.CoreNLP- Provides a set of fundamental tools for tasks like tagging, named entity recognition, and sentiment analysis. [^2]: In this section, we will dig a bit into different tracking algorithms. The goal is not to have a deep theoretical understanding of every tracker, but to understand them from a practical standpoint. [^3]: controlnet tile用法:在文生图时,选择controlnet tile模型,模型参考图选择一开始的低分辨率原图。如果成图和原图不太像,可以适当增加模型权重为1.2至1.3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值