我打开一个 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 …