小编use*_*271的帖子

为什么我需要插入 12 个字符来清除这个 bash 命令行?

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

在此处输入图片说明

为什么fooC-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)

bash terminal-emulator

15
推荐指数
1
解决办法
5129
查看次数

如何在手册页中搜索包含连字符的模式?

我试图找到一个命令来搜索所有手册页中包含连字符的模式。

我查看了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,我找到了 …

man

11
推荐指数
1
解决办法
776
查看次数

为什么文件名生成失败会使 zsh 停止处理脚本?

我试图编写一个简短的脚本,该脚本将编写在$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 …

zsh

5
推荐指数
0
解决办法
156
查看次数

为什么 gawk 在来自输入数据时将 `0123` 视为十进制数?

根据$ 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 …

input numeric-data gawk

5
推荐指数
1
解决办法
278
查看次数

标签 统计

bash ×1

gawk ×1

input ×1

man ×1

numeric-data ×1

terminal-emulator ×1

zsh ×1