执行以下脚本时(简化示例):
#!/usr/bin/env python
import pexpect
spawn = pexpect.spawn('/bin/bash')
with open('/tmp/logfile.log', 'w') as f:
spawn.logfile_read = f
spawn.sendline('echo "Hello I am a really long command, in fact I am 100 characters long! Potato Potato Potato....."')
spawn.sendline('exit')
spawn.expect(pexpect.EOF)
Run Code Online (Sandbox Code Playgroud)
我在换行时遇到问题,导致^M字符出现在日志中。pexpect 日志文件现在看起来像这样:
bash-3.2$ echo "Hello I am a really long command, in fact I am 100 characters lo ^Mng! Potato Potato Potato....."
Hello I am a really long command, in fact I am 100 characters long! Potato Potato Potato.....
bash-3.2$ exit
exit …Run Code Online (Sandbox Code Playgroud) 打开我的串行端口/dev/tty/USB0后pyserial:
>>> ser = serial.Serial("/dev/ttyUSB0", 57600)
>>> ser.isOpen()
True
>>> ser.close()
>>> ser.isOpen()
False
Run Code Online (Sandbox Code Playgroud)
我无法再/dev/ttyUSB0使用命令读取,cat /dev/ttyUSB0
通常cat /dev/ttyUSB0是像这样的阻塞命令read,但是在使用 pyserial 打开/关闭串行端口后,该cat命令变得非阻塞,看起来很忙......
有谁知道是什么原因造成的?
我想将内容记录到终端而不将其写入终端process.stdout,process.stderr这样管道传输过程就不会被这些日志污染。
这与 bash 非常等效echo "hello" > /dev/tty(请参阅此问题),但我找不到如何直接/dev/tty从节点访问。
prog2不退出CTRL+D。为什么然后prog1退出CTRL+D?更奇怪的是,信号处理程序不执行任何操作,尽管它以某种方式影响最终结果......
下面两个程序的区别仅在于prog1.c sigaction()使用了in,以及prog2.c signal()使用了in:
@@ -39,10 +39,7 @@
/* read from loopback tty */
if (cpid > 0) {
/* this is the strange part */
- struct sigaction sa;
- sa.sa_handler = child_handler;
- sa.sa_flags = 0;
- sigaction(SIGCHLD, &sa, NULL);
+ signal(SIGCHLD, child_handler);
struct termios tty;
tcgetattr(fd, &tty);
Run Code Online (Sandbox Code Playgroud)
每个程序都只是打开一个环回 tty 并将其自身分成两个进程,其中一个进程从 tty 读取响应,另一个进程将数据写入 tty 设备。然后将从环回tty虚拟设备接收到的数据输出到控制终端。
编译prog1并prog2使用-lutil选项。启动每个程序并输入hello<CTRL+D>. 这会产生以下输出:
$ ./prog1 …Run Code Online (Sandbox Code Playgroud) 许多命令(例如watch、less)能够暂时清除 tty 以全屏显示信息,然后当命令退出时恢复原始 tty 内容。
有没有办法在 bash 脚本中实现这一目标?
DOS 有int 21h / AH=08H: Console input without echo。
Linux 有类似的东西吗?如果我需要在输入的值显示在终端之前对其进行处理。
在Linux上设置自定义波特率的方法有哪些?
这个问题的答案必须是在ioctl系统调用级别以上的用户级低级API(等等)级别.它至少应该在这些情况下有用:
编写使用串行端口的低级基于C的用户态代码,
编写抽象串口功能的库,
编写内核串口驱动程序.
我正在尝试调试 Linux 内核的模块。我听说可以将控制台输出发送到串行端口。我在 vmware 上运行 Ubuntu,想要向主机发送 printk 消息。我已经成功建立了一个串行连接,并且可以通过输入 echo > simething /dev/ttyS1 向主机发送回显,但我不知道如何将控制台上的输出发送到 ttyS1。
我的主要问题是,当模块/内核崩溃时,最后的 printk 消息会丢失,甚至不会显示,它只是缓冲。
我想在我的 docker 映像中安装 sql cmd。我的 dockerfile 有这些命令来安装 sqlcmd (centos 7 基本映像)
RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo
RUN yum remove mssql-tools unixODBC-utf16-devel
RUN yum install -y unixODBC-devel mssql-tools
Run Code Online (Sandbox Code Playgroud)
以下是 docker 构建日志
Transaction test succeeded
Running transaction
Updating : libcom_err-1.42.9-17.el7.x86_64 1/14
Installing : unixODBC-2.3.7-1.rh.x86_64 2/14
Updating : libss-1.42.9-17.el7.x86_64 3/14
Installing : e2fsprogs-libs-1.42.9-17.el7.x86_64 4/14
Installing : e2fsprogs-1.42.9-17.el7.x86_64 5/14
Updating : 1:openssl-libs-1.0.2k-19.el7.x86_64 6/14
Installing : 1:make-3.82-24.el7.x86_64 7/14
Installing : 1:openssl-1.0.2k-19.el7.x86_64 8/14
/var/tmp/rpm-tmp.8S1dKq: line 17: /dev/tty: No such device or address
error: %pre(msodbcsql17-17.5.2.1-1.x86_64) scriptlet failed, …Run Code Online (Sandbox Code Playgroud)