AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 452757
Accepted
iBug
iBug
Asked: 2018-06-30 22:07:12 +0800 CST2018-06-30 22:07:12 +0800 CST 2018-06-30 22:07:12 +0800 CST

`less` 如何从标准输入获取数据,同时仍然能够读取用户的命令?

  • 772

正如你们大多数人多次做过的那样,使用以下命令查看长文本很方便less:

some_command | less

现在它的标准输入连接到一个管道(FIFO)。它怎么还能读取像 up/down/quit 这样的命令?

less
  • 2 2 个回答
  • 3966 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-06-30T23:24:44+08:002018-06-30T23:24:44+08:00

    正如William Pursell所提到的,less从终端读取用户的击键。它显式打开/dev/tty控制终端;这给了它一个与标准输入分开的文件描述符,它可以从中读取用户的交互式输入。如有必要,它可以同时从其标准输入读取数据以显示。(如有必要,它也可以直接写入终端。)

    您可以通过运行看到这种情况

    some_command | strace -o less.trace -e open,read,write less
    

    移动输入,退出less并查看less.trace: 你会看到它的内容 open /dev/tty,并从文件描述符 0 和打开时返回的任何一个/dev/tty(可能是 3)中读取。

    对于希望确保它们正在从终端读取和写入终端的程序来说,这是一种常见的做法。一个例子是 SSH,例如当它要求输入密码或密码时。

    正如schily所解释的,如果无法打开,将从其标准错误(文件描述符 2)中读取。的使用是在 1991 年 4 月 2 日发布的版本 177 中引入的。/dev/ttylessless/dev/tty

    如果您按照Hagen von Eitzen的建议cat /dev/tty | less尝试运行,将成功打开,但在关闭之前不会从中获得任何输入。所以你会看到屏幕空白,在你按下杀死(或以其他方式杀死它)之前什么都没有;然后将显示您在运行时键入的任何内容,并允许您控制它。less/dev/ttycatCtrlCcatlesscat

    • 55
  2. schily
    2018-07-01T00:33:31+08:002018-07-01T00:33:31+08:00

    UNIX 提供了两种在标准输入被重定向时读取用户输入的方法:

    • 原始方法是从stderr读取。Stderr 对写入和读取是开放的,这在 POSIX 中仍然被提及。

    • 后来的 UNIX 版本(大约 1979 年)添加了一个/dev/tty驱动程序接口,允许打开进程的控制 tty。由于存在没有控制 tty 的进程,因此尝试打开可能会/dev/tty失败。因此,友好的编写软件会回退到原始方法,然后尝试从 stderr 读取。

    • 28

相关问题

  • 如何让`less`理解代码页?

  • 短时间后自动退出 less

  • 在不丢失当前模式的情况下使用 less 搜索模式?

  • 如何减少将标签显示为标签?

  • 更少:使用 AND 的多个过滤条件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve