AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-14960

user001's questions

Martin Hope
user001
Asked: 2022-02-15 18:36:09 +0800 CST

终端模拟器设置控制粗体字体的呈现

  • -1

粗体字体 (ANSI: CSI 1 m) 的效果似乎取决于终端仿真器。例如,在不同的终端模拟器上运行以下脚本

#!/bin/sh
echo "TERM = $TERM"
for mode in 0 2 1 '1;2'; do
    printf '\033[%s;38;5;%dm\033[48;5;%dm%s\033[0m\n' "$mode" 0 15 "testing ($mode)"
done

给出以下输出

在此处输入图像描述

在测试的终端仿真器中,只能xterm正确呈现粗体文本(模式=1)。其他终端仿真器似乎为粗体字体选择了更亮的颜色(通常也将其与粗体字体结合使用)。奇怪的是,st当给定参数时,会产生正确着色的粗体文本1;2,对应于bold;faint.

认为也许这些终端仿真器期望粗体字体的不同控制序列,我检查了terminfo,但发现一致

$ for term in xterm-256color st-256color rxvt-unicode-256color tmux-256color; do printf "%-24s" "$term"; TERM=$term tput bold | cat -v; echo; done
xterm-256color          ^[[1m
st-256color             ^[[1m
rxvt-unicode-256color   ^[[1m
tmux-256color           ^[[1m

这就引出了一个问题,哪些终端仿真器参数控制粗体字体的效果?如何防止转向更亮的颜色?这可以通过Xresources或terminfo定制来解决吗?(顺便说一句,是否有对应的参数vim?它表现出类似的行为,不一定对应于运行它的终端仿真器的行为。)

colors terminal-emulator
  • 2 个回答
  • 77 Views
Martin Hope
user001
Asked: 2019-08-06 16:50:47 +0800 CST

保留 heredocs 中的反斜杠换行符在子 shell 中运行

  • 2

只要不存在终端反斜杠,在变量中捕获heredoc的输出后,就会保留heredoc的换行符:

var=$(cat <<-EOF
a
b
c
EOF
)
echo "$var"

a
b
c

但是,当尝试存储反斜杠换行符时,换行符会丢失:

var=$(cat <<-EOF
a \\
b \\
c
EOF
)

echo "$var"
a \b \c

添加额外的反斜杠以进一步转义并没有帮助。

当然,当不在子shell中运行时,可以使用heredoc生成以反斜杠换行符结尾的行:

$ cat <<-EOF
a \\
b \\
c
EOF
a \
b \
c

为了避免这个问题,可以添加一个换行符来通过变量的转换来生成所需的输出:

var=$(cat <<-EOF
a \\@
b \\@
c
EOF
)

tr -d '@' <<<"$var"

a \
b \
c

有没有更直接的方法来保留在子外壳中运行的 heredocs 中的反斜杠换行符?

bash here-document
  • 2 个回答
  • 3824 Views
Martin Hope
user001
Asked: 2019-06-03 14:13:11 +0800 CST

在复合命令中设置 bash 选项

  • 10

我发现extglob仅在复合化合物中设置 shell 选项会导致后续扩展 glob 失败。是否需要在复合命令之外设置 shell 选项?我在 Bash 手册页中没有看到这种要求的迹象。

例如,以下脚本可以正常工作(打印a.0 a.1):

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)

但是,如果最后两行作为复合命令执行,则脚本将失败并出现以下错误:

syntax error near unexpected token `('
`    ls "a."!(b*)'

这是使用从 4.2 到 4.4 的 Bash 版本以及各种复合命令进行测试的:

(1) 有条件的——if

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
if true; then
    shopt -s extglob
    ls "a."!(b*)
fi

(2) 大括号——{ }

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
{
    shopt -s extglob
    ls "a."!(b*)
}

(3) 子壳—— ( ):

#!/bin/bash
touch a.0   a.1 \
      a.b.0 a.b.1
(
    shopt -s extglob
    ls "a."!(b*)
)

在所有情况下,如果将shopt移到复合命令之外,则脚本会成功。

bash shopt
  • 1 个回答
  • 618 Views
Martin Hope
user001
Asked: 2019-05-22 14:04:46 +0800 CST

在 `tmux` 中设置 `xterm-keys` 会影响 `vim` 中的 Shift-Enter

  • 0

我在 tmux 中启用xterm-keys了正常的 xterm 键绑定,例如使用Ctrl 箭头键移动整个单词。

但是,通过启用xterm-keys它会导致Shift-Enter在vim. 特别是,Shift-Enter在正常模式下按下会切换从光标位置开始的 13 个字母的大写,而与单词边界无关。在命令模式下按下键会退出该模式,然后切换 13 个字母的大小写。通常在 中vim,此按键的结果是向下移动一行(正常模式)或执行任何输入的命令(命令模式),据我所知,这些是默认行为。

我已经用空.tmux.conf和.vimrc文件重现了这个效果,所以它不是其他配置设置的副作用。

vim tmux
  • 1 个回答
  • 837 Views
Martin Hope
user001
Asked: 2019-05-20 14:12:34 +0800 CST

mmap:其他进程写入以前只读映射的文件的影响

  • 5

我试图了解当mmap系统调用已映射到内存的文件随后被其他进程写入时会发生什么。

我在“进程A”中对mmap内存进行了保护。PROT_READ如果我关闭进程 A 中的底层文件描述符,然后另一个进程写入该文件(不使用mmap; 只是将 stdout 简单重定向到>shell 中使用的文件),mmap进程 A 的地址空间中的 ed 内存是否受影响? 鉴于这些页面是只读的,我希望它们不会改变。但是,在尝试解析映射的内存时,SIGBUS由于无效的内存访问 ( ) ,进程 A 被信号终止。Non-existent physical address at address 0x[...]我怀疑这是由其他进程写入支持文件引起的。设置MAP_PRIVATE是否足以完全保护此内存免受其他进程的影响?

c mmap
  • 1 个回答
  • 2167 Views
Martin Hope
user001
Asked: 2018-07-18 13:19:49 +0800 CST

主要为 `find` 的变量 `-name`

  • 1

我正在-name尝试find从\( -name ${a[0]} -or -name ${a[1]} -or -name ${a[2]} ... \). 虽然在终端中显式输入名称 primary 有效,但将其存储在变量中并通过参数扩展调用它却行不通。由于扩展将在find运行之前进行,因此我认为问题与扩展变量的引用有关。

下面是 n=2 个名称的最小示例,可以按字面输入或从变量中调用。虽然我意识到我可以通过管道传输到,但在这种情况下grep我更愿意做所有事情。find

$ ls
a1  a2  b1  b2  c1  c2

$ find . \( -name a\* -or -name b\* \)
./a1
./a2
./b1
./b2

$ names="\( -name a\* -or -name b\* \)"

$ printf "%s\n" "$names"
\( -name a\* -or -name b\* \)

$ find . $(printf "%q" "$names")
find: -name\: unknown primary or operator

$ find . $(printf "%s" "$names")
find: \): unknown primary or operator

$ find . $names
find: \): unknown primary or operator

$ find . "$names"
find: \( -name a\* -or -name b\* \): No such file or directory
shell find
  • 1 个回答
  • 298 Views
Martin Hope
user001
Asked: 2018-01-08 03:46:16 +0800 CST

通过进程替换同时运行的独立进程的非确定性输出

  • 3

在bash v4.1.2(2)上,以下简单语句仅作为演示问题的最小示例而选择,给出看似随机的输出:

$ for n in {0..1000}; do echo "$n"; done | 
  tee >(head -n2) >(sort -grk1,1 | head -n3) >/dev/null

而以下给出一致的输出:

$ seq 0 10000 | tee >(head -n2) >(sort -grk1,1 | head -n3) >/dev/null

具体来说,对于第一条语句,该sort命令选择明显随机的连续三元组(例如,226,225,224;52,51,50;174,173,172 等)。要了解输出的异质性,可以多次运行有问题的命令,然后列出不同可能性的数量:

$ seq -w 0 2000 | while read x; do for n in {0..1000}; do echo "$n"; done | 
  tee >(head -n2) >(sort -grk1,1 | head -n3) >/dev/null | cat > "file_${x}"; done

计算各种输出的出现次数:

$ for f in file_*; do sort -g "$f" | tail -n3 | paste -sd, ; done  | 
  sort | uniq -c | sort -gk1,1 -k2,2
   1 7,8,9
   1 17,18,19
   1 40,41,42
   1 43,44,45
   1 47,48,49
   1 50,51,52
   1 54,55,56
   1 58,59,60
   1 59,60,61
   1 66,67,68
   1 71,72,73
   1 78,79,80
   1 103,104,105
   1 104,105,106
   1 106,107,108
   1 110,111,112
   1 111,112,113
   1 121,122,123
   1 125,126,127
   1 129,130,131
   1 134,135,136
   1 136,137,138
   1 142,143,144
   1 143,144,145
   1 148,149,150
   1 150,151,152
   1 156,157,158
   1 157,158,159
   1 165,166,167
   1 171,172,173
   1 173,174,175
   1 174,175,176
   1 177,178,179
   1 179,180,181
   1 181,182,183
   1 183,184,185
   1 185,186,187
   1 186,187,188
   1 191,192,193
   1 194,195,196
   1 198,199,200
   1 200,201,202
   1 206,207,208
   1 208,209,210
   1 209,210,211
   1 210,211,212
   1 216,217,218
   1 217,218,219
   1 233,234,235
   1 236,237,238
   1 237,238,239
   1 238,239,240
   1 242,243,244
   1 245,246,247
   1 246,247,248
   1 254,255,256
   1 256,257,258
   1 267,268,269
   1 270,271,272
   1 273,274,275
   1 277,278,279
   1 279,280,281
   1 287,288,289
   1 288,289,290
   1 305,306,307
   1 306,307,308
   1 307,308,309
   1 326,327,328
   1 337,338,339
   1 339,340,341
   1 340,341,342
   1 351,352,353
   1 357,358,359
   1 359,360,361
   1 365,366,367
   1 368,369,370
   1 370,371,372
   1 376,377,378
   1 377,378,379
   1 383,384,385
   1 386,387,388
   1 388,389,390
   1 401,402,403
   1 408,409,410
   1 409,410,411
   1 415,416,417
   1 419,420,421
   1 424,425,426
   1 426,427,428
   1 432,433,434
   1 454,455,456
   1 462,463,464
   1 466,467,468
   1 475,476,477
   1 482,483,484
   1 487,488,489
   1 504,505,506
   1 508,509,510
   1 511,512,513
   1 532,533,534
   1 538,539,540
   1 544,545,546
   1 548,549,550
   1 558,559,560
   1 603,604,605
   1 604,605,606
   1 608,609,610
   1 659,660,661
   1 660,661,662
   1 663,664,665
   1 668,669,670
   1 692,693,694
   1 699,700,701
   1 717,718,719
   1 738,739,740
   1 740,741,742
   1 750,751,752
   1 771,772,773
   1 784,785,786
   1 796,797,798
   1 799,800,801
   1 806,807,808
   1 814,815,816
   1 832,833,834
   1 848,849,850
   1 858,859,860
   1 869,870,871
   1 922,923,924
   1 952,953,954
   1 961,962,963
   1 985,986,987
   2 64,65,66
   2 127,128,129
   2 141,142,143
   2 169,170,171
   2 170,171,172
   2 172,173,174
   2 187,188,189
   2 221,222,223
   2 234,235,236
   2 252,253,254
   2 292,293,294
   2 350,351,352
   2 364,365,366
   2 375,376,377
   2 622,623,624
   2 666,667,668
   3 70,71,72
   3 102,103,104
   3 137,138,139
   3 155,156,157
1826 998,999,1000

表明结果在约 91% 的时间内是正确的。从语句中省略>(head -n2)进程替换tee会导致输出 100% 正确。我不明白为什么竞争条件与解释问题有关,因为这只会影响tee语句中每个进程替换的输出的相对顺序(即,>(head -n2)可能首先完成或>(sort -grk1,1 | head -n3)可能这样做,但这应该只影响输出顺序,而不是结果本身;如果两个命令的输出是随机交错的,这甚至是可以理解的)。由于应该将循环的tee相同副本分配给每个循环的副本,并且由于两个进程替换都在单独的子shell中运行(stdoutstdin>()https://unix.stackexchange.com/a/331199/14960),任何一个都不应该影响另一个,但它们显然相互作用。如何解释相互作用?此外,如何将for/while循环的输出bash分配给多个独立进程tee?

bash tee
  • 1 个回答
  • 221 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve