我只是在阅读 readline 手册页,发现了一堆我不知道的很棒的命令。但是,有几个没有默认的键绑定。有没有办法从 shell 执行未绑定的命令?
我不是在问如何在 ~/.inputrc 中绑定命令,而是如何从 shell 或 bash 脚本中“一次性”执行它。
例如,“转储变量”命令。是否有一些命令我可以提供“转储变量”作为参数来执行它?
有人可能认为
echo foo >a
cat a | rev >a
Run Code Online (Sandbox Code Playgroud)
将离开a包含oof; 但它是空的。
rev于a?我以前经历过类似的行为,但直到现在我才能重现它:影响下一个命令提示符后文本的命令的输出,准备Enter由用户编辑。
以下面的例子为例:
cat /usr/share/terminfo/a/ansi
Run Code Online (Sandbox Code Playgroud)
具有以下效果:
或者,复制并粘贴:
1%dP1%dM1%dB1%d@1%dS1%dL1%dD1%dC1%dT1%dA%p1%c2%{1}%-%db%p1%dd
1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m +%d;%dR;0123456789]c1%dm1%dmAX[user@untrusted ~]$ R65;1;9c
Run Code Online (Sandbox Code Playgroud)
如您所见,R65;1;9c出现在命令提示符之后,按下Enter它会将其评估为命令。
我确实记得文本不仅出现在命令行之后,而且还被再次执行的情况,可能是因为它包含换行符。
这可以被认为是错误还是预期的行为,某种不可打印字符的组合允许在下一个命令提示符之后写入?
似乎来自一个简单的 shell 重定向为/dev/ptmx我提供了一个新的伪终端。
$ ls /dev/pts; ls /dev/pts </dev/ptmx
0 1 2 ptmx
0 1 2 3 ptmx
Run Code Online (Sandbox Code Playgroud)
一旦拥有 fd 声明的进程/dev/ptmx退出,它就会消失,但保留它很简单:
$ PS1='<$(ls -1 "$@" /dev/pts/*|uniq -u)> $ ' \
exec 3<>/dev/ptmx "$0" -si -- /dev/pts/*
</dev/pts/3> $ ls /dev/pts; exec 3>&-
0 1 2 3 ptmx
<> $ ls /dev/pts; exec 3<>/dev/ptmx
0 1 2 ptmx
</dev/pts/3> $ exit
Run Code Online (Sandbox Code Playgroud)
所以看起来简单的open()就/dev/ptmx足以得到一个伪终端。我想这会使 shell - (或它进行重定向的进程) - pty 主端的所有者。
但是我如何分配从属端 - 或者我可以分配从属端?如果可以的话——我能用它做什么?我可以影响它的读/写/刷新时间 …
我在 bash shell 上,我希望命令的输出直接出现在命令执行后出现的命令提示符中!
我设想的示例,以说明我的想法:
locate create_tables.sql|MAGIC_command
user@localhost:~# /usr/share/doc/phpmyadmin/create_tables.sql
Run Code Online (Sandbox Code Playgroud)
现在,像这样使用 comman dsubstitution
sudo $(locate create-tables.sql)
Run Code Online (Sandbox Code Playgroud)
工作但 立即执行输出,我希望能够之前编辑它。有办法吗?
我找不到从bash做到这一点的方法。那么有没有办法定义一个 bash readline 快捷方式,它将在光标位置插入一个动态生成的字符串?
例如,我想插入日期:
bind '"\C-xx": my-dynamical-date'
aaa bbb
--------
^ cursor is here
# After pressing "\C-xx":
aaa Sun Apr 22 22:19:00 CST 2018 bbb
------------------------------------
^ cursor is here
Run Code Online (Sandbox Code Playgroud)
那么如何定义 my-dynamical-date readline 命令呢?
除了反复击打之外,还有什么方法可以查看整个杀戮环吗?M-y
类似于 emacs browser-kill-ring 但用于 shell