`

用shell实现bat的pause

阅读更多

在2007年8月5日 (日) 15:00所做的修订版本

windows批处理程序中的pause命令可以实现“按任意键继续”的效果,要在shell中实现这一功能,可以借助read。

注意:
注意不是所有的shell提供的read都支持本文介绍的方法。目前本文已确定适用于bash

简单实现

你可能还没注意到read的强大功能,其实只要用下面的代码,就可以实现简单的"pause"。

read -n 1 -p "Press any key to continue..."

但它有明显的不足:

  • 如果用户输入的不是回车,虽然能"continue",但没有输出换行,导致输出格式混乱。(直接在命令提示符下运行更为突出)。
  • 用户输入的字符会显示在屏幕上,影响美观。
  • 如果进行了输入重定向,哪怕有:

<bash> while read line do … read -p somevar … done < somefile </bash> 这样的代码,都会导致错误。

改进

关于重定向引发的错误,如果需要,可以用文件描述符代替重定向解决。目前没有想到更好的解决方案。主要针对前两个不足做了改进。 <bash> read -n 1 -p "Press any key to continue..." INP if [[ $INP != ]] ; then

       echo -ne '\b \n'

fi </bash> 说明:

  • 记录了输入的字符(存到$INP),以便处理。
  • 注意如果输入的是回车,read一个字符也读到,而不是读到\n。
  • 当输入不是换行时,用退格盖掉原来的空格。

为了方便使用,可以写成: <bash>

  1. ! /bin/bash

function pause(){

       read -n 1 -p "$*" INP
       if [[ $INP !=  ]] ; then
               echo -ne '\b \n'
       fi

}

  1. 使用时:

pause 'Press any key to continue...' </bash>

仍存有的问题:

  • 对空格和Tab支持不好。
  • 重定向的问题没有解决。

参考资料

转载于http://www.linux-wiki.cn/index.php?title=%E7%94%A8shell%E5%AE%9E%E7%8E%B0bat%E7%9A%84pause&diff=prev&oldid=346

分享到:
评论

相关推荐

    脚本小闹钟 .bat的

    ECHO ECHO PAUSE ^&gt;^&gt;%temp%\x.bat &gt;&gt; %temp%\3.bat ECHO ECHO DEL ^%%^%%0 ^&gt;^&gt;%temp%\x.bat &gt;&gt; %temp%\3.bat ECHO start/max %temp%\x.bat &gt;&gt; %temp%\3.bat ECHO del %temp%\1.cab ^&^& del %%0 &gt;&gt; %temp%\3.bat ...

    【项目】pyETRC列车运行图系统.zip

    本系统与ETRC列车运行图系统的实现各有侧重。相比本系统,ETRC列车运行图系统有如下的特色比较突出: 动态运行图。本系统不支持此功能。 对于精确到客运时刻的需求,自带较完善的线路数据库和车次时刻数据库。而本...

    redis windows X86 2.6.12最新稳定版

    start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit :begin cd\ cd c:\redis redis-server.exe redis.conf pause 注意:代码中 c:\redis 是redis所有目录 2、停止运行...

    Windows Powershell 执行文件和脚本

    象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中。 关于脚本 脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器...

    MySQL-8.0.12下载安装配置方法

    1. 下载 2. 解压 3. 环境变量Path加 D:\Program Files\mysql-8.0.12-winx64\bin 4. 在文件夹下新建data文件夹,my.ini文件,my.ini内容为 [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 ...pause

    MySQL8.0.12下载安装配置方法

    1. 下载 2. 解压 3. 环境变量Path加 D:\Program Files\mysql-8.0.12-winx64\bin 4. 在文件夹下新建data文件夹,my.ini文件,my.ini内容为 [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 ...pause

    cmd操作命令和linux命令大全收集

    3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开...

    大学模拟技术基础答案1

    最佳答案在电脑屏幕的左下角按“开始→程序→附件→记事本”,把下面的文字复制进去,点“另存为”,路径选“桌面”,保存类型为“所有文件”,文件名为“清除系统LJ.bat”,就完成了。记住后缀名一定要是.bat, ok!...

    MS-DOS 5.0

    6.9 Mice and MS-DOS Shell 6.10 NCR VGA BIOS 6.11 Olivetti Systems 6.12 Toshiba T3100SX 6.13 Western Digital VGA Card 6.14 Zenith Computers 7. Making Your Network Compatible with MS-DOS 5.0 7.1 ...

    计算机应用技术(实用手册)

    这个项目可指定让AGP装置来使用的系统内存大小,这取用大小是PCI内存地址范围的一部份,可分配给图形内存的空间。 Init Display First: 这个项目可选择当系统开机时先行对AGP或是PCI插槽来做初始化的动作。 [AGP...

    VB编程资源大全(英文源码 API)

    down height using API.&lt;END&gt;&lt;br&gt;15 , bat-os.zip This demonstrates how to retrieve information about Battery Powered machines.&lt;END&gt;&lt;br&gt;16 , display.zip This will open the Screen Resolution Dialog ...

Global site tag (gtag.js) - Google Analytics