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
    • 最新
    • 标签
主页 / user-158192

Alex028502's questions

Martin Hope
Alex028502
Asked: 2024-04-14 01:40:27 +0800 CST

xterm 似乎改变了 emacs 的“home”键行为

  • 5

在 xterm 中,当我按键盘上的 HOME 键时,它通常会发送,^[[H但是当我打开时emacs -nw,它会更改为^[OH; 这些分别是home和khome。我在尝试构建自己的终端时发现它^[[H在 emacs 中不起作用。但是,我无法弄清楚是什么导致 xterm (或 emacs)改变其行为。

此外

  • home“应该”对应于和的键khome(我通常使用的 home 键,以及关闭数字锁定的键盘上的 1) - 在我尝试过的每个终端上始终执行相同的操作,即使 xev 显示它们是不同的,所以对于其余的对于这个问题,我会将它们视为同一件事。
  • 它似乎与 pty 设置无关。我曾经stty -g在打开 emacs 的情况下复制设置,然后通过cat -v运行应用它们,但我仍然得到非 emacs 的行为。(下面的演示)
  • bash 的 readline 似乎比 emacs 和/或读取 TERM 变量更容易接受,因为无论我尝试什么终端,HOME 总是在 bash 中工作

这是我的实验:

xterm

获取终端信息:

$ tty
/dev/pts/1
$ echo $TERM
xterm
$ infocmp $TERM | grep home
    el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
    kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,

尝试按 HOME 键,然后按返回cat -v,然后退出

$ cat -v
^[[H
^[[H
^C

打开 emacs

$ emacs -nw

尝试主页键的行为(它有效 - 我不会发布视频)

使用C-q来查看密钥发送的内容:

[^OH 在 emacs 中 在 xterm 中

同时在另一个终端(不必是 xterm)中,复制 emacs pty 设置:

$ emacs_settings=$(stty -F /dev/pts/1 -g)
$ echo $emacs_settings
4001:1:bf:a31:7:7:7f:15:4:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:

然后退出 emacs 并cat -v重新开始

$ cat -v

然后返回第二个终端 - 将 xterm pty 设置回 emacs 使用的设置

$ stty -F /dev/pts/1 $emacs_settings

然后在 xterm 中再次按 home:(然后按 return 并退出)

$ cat -v
^[[H^M

它与 emacs 之外的代码一样,是home代码,而不是khome有人在 emacs 中插入的代码。

现在,如果您在家中尝试此操作,并且想要退出cat -v,则需要使用 ctrl+G 而不是 ctrl+C,因为 emacs 设置会更改一些键。这证明设置有效。您还可以看到退出行末尾没有 ^G,但有一个回车符 - 我猜是因为回显设置发生了变化,并且处于原始模式。

如果您好奇的话,这里是人类可读的 emacs pty 设置。

$ stty -F /dev/pts/1 -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^G; quit = ^G; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>;
rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

其他终端

linux
$ infocmp linux | grep home
    home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
    kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,

这个不太容易截图(我可以拍照,但我没有)

总结是 - 无论您是否在 emacs 中,HOME 键都会khome从终端设置发送,并且它始终在 emacs 中起作用。

MATE 终端 ( xterm-256color)
$ echo $TERM
xterm-256color
$ infocmp $TERM | grep home
    el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
    kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
$ cat -v
^[[H
^[[H
^C

但它再次发送到^[OHemacs 内部!所以他们又是不同的。我不知道我之前是怎么错过这个的。我猜 MATE 终端完全实现了 xcode 的功能,或者使用了一些相同的组件。

另一方面:

超 (xterm-256color)

在这种情况下,他们只是khome一直发送,并且 HOME 键似乎仍然按照您期望的方式工作。

$ echo $TERM
xterm-256color
$ cat -v
^[OH
^[OH
^C
$ emacs -nw
$ # ... ^[OH again 
tmux(在 MATE 终端中)screen

我不知道 tmux 何时设置TERM为screen以及何时将其设置为tmux,但今天在这台计算机上,在该主机终端中,它是screen。

$ echo $TERM
screen
$ infocmp $TERM | grep home
        enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG,
        khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
$ cat -v
^[[1~
^[[1~
^C
$ emacs -nw
$ # also ^[[1~ with C-q inside emacs

围捕
  • 有些终端只是khome一直发送,而其他终端则设法khome在 emacs 内部发送,home其余时间都发送。
  • khome两者home都适用于 bash readline,但仅khome适用于 emacs - 或者只有一个固定的可在 emacs 中使用的 home 键列表(我说的是默认配置) - 我倾向于固定列表,因为我无法获取 emacs通过改变来改变行为TERM
大问题

xterm(和 MATE 终端)如何设法更改在 emacs 打开时发送的代码。

以下是我能想到的一些猜测:

a) xterm 有一个关于 emacs 的特殊规则 b) emacs 有一个关于 emacs 的特殊规则xterm c) emacs 确实会更改终端设置来导致这种情况,但无论该设置是什么,cat如果您尝试让 cat 使用该设置,它都会不断地更改回来

值得一提的小问题
  • 为什么看起来像的键不对应home并khome发送相应的值?
  • emacs(默认情况下)是否根据 改变其行为TERM?
emacs
  • 1 个回答
  • 35 Views
Martin Hope
Alex028502
Asked: 2024-04-02 00:50:37 +0800 CST

如何使用 getty 将 bash 进程连接到 tty _without_

  • 4

我将有两个串行 USB 设备相互连接,/dev/ttyUSB1并且/dev/ttyUSB2. 我想/bin/bash连接到一端运行,以便我可以使用 picocom 连接到另一端并将picocompicocom 用作本地终端模拟器。

我尝试过这样的事情

setsid /bin/bash </dev/ttyUSB2 >/dev/ttyUSB2 2>&1

然后用picocom连接到另一端,但我只是得到一个充满乱码的屏幕(:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$ 0m:~$)..(波特率匹配,并且两个终端可以与两端的两个picocom通信)

然而,我真的不知道自己在做什么。谁能告诉我这个秘密吗?


更正/更新:

在另一台计算机上,我不再收到以前收到的乱码。当我如上所述将 bash 连接到一个 tty 并使用 picocom 连接到另一端时,我现在收到提示,并且我可以运行命令,但我的命令不会回显给我(我只看到结果),而且我没有“作业控制”(我用 Ctrl+C 进行测试,这不会停止睡眠过程)


背景:

我已经通过另外两种方式成功使用 picocom 作为本地终端模拟器:

  1. 与盖蒂:

    sudo systemctl start [email protected]
    

    允许我成功连接到/dev/ttyUSB1picocom,但我必须登录。(感谢此答案https://unix.stackexchange.com/a/772040/158192对上一个问题)

  2. 与索卡特

    $ socat -d -d PTY,raw,echo=0 EXEC:"/bin/bash",pty,stderr,setsid,sane
    2024/04/01 18:32:13 socat[40547] N PTY is /dev/pts/4
    ...
    

    这允许我像这样使用 picocom 作为本地终端picocom /dev/pts/4


所以是的,我应该能够自己将 /bin/bash 连接到 USB tty,对吧?但我的试验都有错误。

terminal
  • 1 个回答
  • 35 Views
Martin Hope
Alex028502
Asked: 2024-03-11 03:25:11 +0800 CST

当我尝试通过串行设置 getty 时,作业控制不起作用

  • 6

我正在尝试设置 getty 通过串行登录(主要作为实验)。

几乎任何配置都会发生同样的事情。如果我的默认 shell 是bash,我在登录后会收到以下消息:

-bash: cannot set terminal process group (15297): Inappropriate ioctl for device
-bash: no job control in this shell

然后为了证明它不起作用,我不能使用ctrl+C来停止程序:

$ sleep 30
^C

而且似乎没有发出信号。

这些是我尝试过的配置:

我已经尝试过这两个命令

# copied from raspberry pi:
sudo /sbin/agetty --keep-baud 115200,38400,9600 ttyUSB0 vt220
# something else I read somewhere
sudo getty -L ttyUSB0 9600 vt100
# (I know I'm mixing and matching a lot of differences but the result is the same)

我作为客户端尝试过 screen 和 picocom。

我尝试过使用 rasberry pi 作为服务器,以及两台不同的 ubuntu 笔记本电脑。

我尝试过两个 FTDI、两个 RS-485 USB 适配器,以及 getty 端的内置 RS232 和客户端的 USB RS232。

我还尝试将默认 shell 更改为 sh 和 dash。我没有收到消息,但 ctrl+C 仍然无法按预期工作

有趣的是 - 当树莓派自动配置/dev/ttyAMA0,并且它完全使用我放置的 getty 命令时,作业控制起作用了!

并且终端设置几乎相同。(实际上除了-iutf8)

以下是 FTDI 连接和 picocom 运行的终端设置:

$ stty -a -F /dev/ttyUSB0
speed 9600 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr
-icrnl ixon ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0
tab0 bs0 vt0 ff0
isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase
-tostop -echoprt echoctl echoke -flusho -extproc
$ stty -a -F /dev/ttyUSB1
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr
-icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0
cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase
-tostop -echoprt echoctl echoke -flusho -extproc

我究竟做错了什么?为什么它可以与树莓派上内置串口的内置配置一起使用?

tty
  • 1 个回答
  • 21 Views
Martin Hope
Alex028502
Asked: 2023-04-18 20:38:27 +0800 CST

为什么 stty 设置 onlcr 不添加回车?

  • 5

TLDR - 我已经onlcr在我的终端中配置了,但我没有看到\r添加


如果将两个 FTDI 串行转换器插在一起,并将它们都插入我的电脑,我会得到两个/dev/ttyUSB0端口/dev/ttyUSB1

如果我在不同的终端中打开它们picocom,我可以通过来回发送消息来确保它们已正确连接,如果我停止使用C-A C-Q它,则端口配置如下:

$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc
-ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl
echoke -flusho -extproc
$ stty -F /dev/ttyUSB1 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

现在,如果我打开两个终端来监听两个串口:

$ cat -v /dev/ttyUSB0
$ cat -v /dev/ttyUSB1

(实际上,对于这个特定的实验,我只需要其中之一,但同时拥有两者也无妨)

然后在第三个终端中,像这样发送一行:

$ echo this is a test > /dev/ttyUSB1

然后再发送一行来证明我正在打印回车符:

$ echo -e 'this is another test\r' > /dev/ttyUSB1

那么这就是我所看到的:

$ cat -v /dev/ttyUSB0
this is a test
this is another test^M

^M为什么我在第 1 行和^M^M第 2 行中看不到?

icrnl在两个设备上都关闭,所以它不应该将其转换回来吗?

为什么会(或不会)发生这种情况?

tty
  • 1 个回答
  • 14 Views
Martin Hope
Alex028502
Asked: 2022-01-15 10:59:00 +0800 CST

有没有办法 ssh 隧道,并访问 /dev 目录中的设备,并像本地一样使用它?[复制]

  • 0
这个问题在这里已经有了答案:
我可以在 /dev 下跨主机共享设备吗? (3 个回答)
9 个月前关闭。

有没有一种方法可以让一台计算机/dev/与另一台计算机共享目录中的设备,而另一台计算机可以与其交互,如果它是本地的?类似于 SSH 隧道的东西?

例如相机,或与 arduino 的串行连接,甚至是计算机的/dev/random?

ssh serial-port
  • 2 个回答
  • 297 Views
Martin Hope
Alex028502
Asked: 2019-06-28 00:42:10 +0800 CST

线上的环境变量搞乱了时间输出

  • 0

看一下这个

$ time echo 1
1

real    0m0.000s
user    0m0.000s
sys     0m0.000s
$ TESTVAR=TEST time echo 1
1
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1932maxresident)k
0inputs+0outputs (0major+74minor)pagefaults 0swaps

我已经通过预先导出变量来解决这个问题,但我很想知道这是为什么。

(ubuntu 和 bash)

environment-variables time
  • 2 个回答
  • 41 Views

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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