我打开一个 xterm 终端(80 列 x 24 行),然后运行$ bash --norc --noprofile
,然后$ tty
获取终端的文件名:输出是/dev/pts/9
.
我从另一个终端运行:
$ printf foo >/dev/pts/9
Run Code Online (Sandbox Code Playgroud)
foo
打印在第一个终端的 shell 命令行上。
如果我按下C-u
运行unix-line-discard
(由 给出的函数名称$ bind -P | grep -i c-u
),foo
则不会被删除。
如果我插入 11 个空格并按C-u
,空格会被删除,但不会被删除foo
。
如果我插入 12 个空格并按C-u
,空格也会被删除foo
。
为什么foo
当C-u
我的光标紧随其后按下时无法删除,为什么我需要插入 12 个字符才能删除它?
环境:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: …
Run Code Online (Sandbox Code Playgroud) 我试图找到一个命令来搜索所有手册页中包含连字符的模式。
我查看了man man
,并找到了以下 3 个选项:
-K
,--global-apropos
在所有手册页中搜索文本。这是一个蛮力搜索,可能需要一些时间;如果可以,您应该指定一个部分以减少需要搜索的页面数。搜索词可以是简单的字符串(默认值),也
--regex
可以是正则表达式(如果使用该选项)。
-w
,--where
,--path
,--location
不实际显示手册页,但打印将被格式化的源 nroff 文件的位置。
-S list
,-s list
,t--sections=list
列表是以冒号或逗号分隔的要搜索的特定于订单的手册部分的列表。此选项会覆盖
$MANSECT
环境变量。(-s
拼写是为了与 System V 兼容。)
我尝试将它们结合起来搜索模式mark-modified-lines
,这是在man bash
以下内容中描述的 readline 选项:
$ man -s1 -Kw mark-modified-lines
Run Code Online (Sandbox Code Playgroud)
但它没有找到任何页面:
No manual entry for mark-modified-lines
Run Code Online (Sandbox Code Playgroud)
并且命令以代码退出16
。
我认为命令的语法可能是错误的,但似乎并非如此,因为此命令正确地在我的系统上找到了包含单词的 5 个手册页guitar
:
$ man -s1 -Kw guitar
/usr/share/man/man1/ffmpeg-all.1.gz
/usr/share/man/man1/ffserver-all.1.gz
/usr/share/man/man1/ffplay-all.1.gz
/usr/share/man/man1/ffmpeg-filters.1.gz
/usr/share/man/man1/ffprobe-all.1.gz
Run Code Online (Sandbox Code Playgroud)
我认为这个词中的连字符可能引起了问题。在 中man bash
,我找到了 …
我试图编写一个简短的脚本,该脚本将编写在$PATH
以下位置找到的所有可执行程序:
for dir in $(tr ':' ' ' <<<"${PATH}"); do
for pgm in $dir/*; do
if command -v "${pgm}" >/dev/null 2>&1; then
echo "${pgm}"
fi
done
done | sort >file
Run Code Online (Sandbox Code Playgroud)
在 bash 中,它按预期工作,但是一旦内部循环中的文件名生成失败,zsh 就会停止处理脚本:
for pgm in $dir/*; do
^^^^^^
...
done
Run Code Online (Sandbox Code Playgroud)
结果,由于 my$PATH
包含一个不包含任何文件 ( /usr/local/sbin
) 的目录,因此在 zsh 中,脚本无法写入之后在目录中找到的可执行文件。
这是另一个显示相同问题的代码:
for f in /not_a_dir/*; do
echo 'in the loop'
done
echo 'after the loop'
Run Code Online (Sandbox Code Playgroud)
在 bash 中,此命令输出:
in the loop
after the loop
Run Code Online (Sandbox Code Playgroud)
并以代码退出0 …
根据$ man gawk
,该strtonum()
函数可以将字符串转换为数字:
strtonum(str)
检查 str,并返回其数值。如果 str 以前导 0 开头,则将其视为八进制数。如果 str 以前导 0x 或 0X 开头,则将其视为十六进制数。哦?否则,假设它是一个十进制数。
如果字符串0
以前导 开头,则将数字视为八进制,而如果以 开头,0x
则将其视为十六进制。
我已经运行这些命令来检查我对函数的理解:
$ awk 'END { print strtonum("0123") }' <<<''
83
$ awk 'END { print strtonum("0x123") }' <<<''
291
Run Code Online (Sandbox Code Playgroud)
该字符串"0123"
被正确地视为包含八进制数并转换为十进制数83
。同样,字符串"0x123"
被正确地视为包含十六进制数并转换为十进制数291
。
现在,如果我运行相同的命令,但将数字字符串从程序文本移动到输入数据,会发生以下情况:
$ awk 'END { print strtonum($1) }' <<<'0123'
123
$ awk 'END { print strtonum($1) }' <<<'0x123'
291
Run Code Online (Sandbox Code Playgroud)
我理解第二个结果,它与前面的命令相同,但我不理解第一个。为什么 gawk 现在将其0123
视为十进制数,即使它以0 …