小编Min*_*Max的帖子

进程替换输出乱序

echo one; echo two > >(cat); echo three; 
Run Code Online (Sandbox Code Playgroud)

命令给出了意外的输出。

我读到:如何在 bash 中实现进程替换?以及互联网上有关进程替换的许多其他文章,但不明白为什么它会这样。

预期输出:

one
two
three
Run Code Online (Sandbox Code Playgroud)

实际输出:

prompt$ echo one; echo two > >(cat); echo three;
one
three
prompt$ two
Run Code Online (Sandbox Code Playgroud)

此外,从我的角度来看,这两个命令应该是等效的,但它们不是:

##### first command - the pipe is used.
prompt$ seq 1 5 | cat
1
2
3
4
5
##### second command - the process substitution and redirection are used.
prompt$ seq 1 5 > >(cat)
prompt$ 1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

为什么我认为,它们应该是一样的?因为,两者都通过匿名管道将seq输出连接到cat …

bash process-substitution

16
推荐指数
2
解决办法
1980
查看次数

如何从 grub 中的 videotest 退出?

我正在使用videotestvbetest程序检查 grub 菜单中不同的视频分辨率,并且grub在使用此程序后无法返回命令行。系统没有响应 - 就像挂了一样。只有 Virtualbox 的“关闭机器”有帮助。

问题:如何退出这种模式?可能是我使用这个程序的错误方式?

我的行动:

  1. 启动时进入 grub 菜单,然后进入命令模式。
  2. videotest 800x600

    项目清单

  3. 看一下新的分辨率示例

    项目清单

  4. 然后,按任意键后,系统停止响应,我无法返回 grub 菜单。得到这个画面:

    在此处输入图片说明

grub2 virtualbox

12
推荐指数
1
解决办法
1910
查看次数

挂载点目录条目与文件系统中的普通目录条目有何不同

我知道目录是一个包含行类型为“名称 = 节点编号”的文件。

当我请求像 /home/my_file.txt 这样的路径时,会发生以下步骤:

  1. 转到第 2 个 inode(根目录默认 inode)
  2. 获取 inode #2 指向的文件。
  3. 搜索此文件并找到“home”条目。获取其 inode 编号,例如 135。
  4. 获取 inode #135 指向的文件。
  5. 搜索此文件并找到“my_file.txt”条目。获取其 inode 编号,例如 245。
  6. 获取 inode #245 指向的文件。

问题:如果主目录是另一个文件系统的挂载点,驻留在另一个块设备上,这个过程有何不同?当系统理解时,这个目录是挂载点,它是如何做到的?这些信息存储在哪里 - 在 inode、目录文件或其他地方?

例如,显示 inode 编号的根目录列表的一部分:

ls -d1i /*/

inode # name
656641  /bin/
2       /boot/
530217  /cdrom/
2       /dev/
525313  /etc/
2       /home/
393985  /lib/
Run Code Online (Sandbox Code Playgroud)

在这里,主目录和引导目录是挂载点并驻留在自己的文件系统上。运行我的伪代码算法(上面写的)并停留在第 3 步 - 在这种情况下,home inode 号是 2,它位于另一个文件系统和另一个块设备中。

filesystems mount inode

8
推荐指数
1
解决办法
2665
查看次数

AltGr 在 Linux 控制台中不起作用

当我在控制台(不是终端模拟器)中时(使用Ctrl+ Alt+后F_AltGr+key组合不起作用。

我正在使用捷克语键盘布局(与许多布局一样)将各种特殊字符映射到AltGr+key组合(我相信有时称为死键)。例如,我可以|通过输入AltGr+ wAltGr是右Alt)来编写。

这在 DE(在我的例子中是 GNOME Shell)中完美运行,但在 Linux 控制台中不起作用。有什么建议如何修复它吗?捷克语布局缺少许多重要的键(例如>),因此在终端中工作有点不可能。我使用带有最新更新的 Fedora 25。

编辑:我刚刚在我的第二台装有 Fedora 25 的电脑上尝试过(但从 F24 升级,仍然使用 X11 而不是 Wayland),它工作正常。

输出dumpkeys | grep -e 'AltGr\|Alt'

keycode  56 = Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt              Alt             
keycode 100 = AltGr            AltGr            AltGr            AltGr            AltGr            AltGr            AltGr            AltGr …
Run Code Online (Sandbox Code Playgroud)

linux special-characters console keyboard-layout

6
推荐指数
1
解决办法
1万
查看次数

如何计算可以作为参数传递给批处理命令的文件数量?

例如,我有通过这种方式创建的多个文件的目录:

touch files/{1..10231}_file.txt
Run Code Online (Sandbox Code Playgroud)

我想将它们移动到新目录中new_files_dir

最简单的方法是:

for filename in files/*; do
    mv "${filename}" -t "new_files_dir"
done
Run Code Online (Sandbox Code Playgroud)

这个脚本在我的电脑上运行了10秒。它很慢。由于mv对每个文件执行命令而导致速度变慢。

###编辑开始###

我明白,在我的例子中,最简单的方法就是

mv files/* -t new_files_dir
Run Code Online (Sandbox Code Playgroud)

或者,如果“参数列表太长”:

printf '%s\0' files/* | xargs -0 mv -t new_files_dir
Run Code Online (Sandbox Code Playgroud)

但上述案例是任务的一部分。整个任务都在这个问题中:在 linux 中根据文件名将大量文件移动到目录中。因此,必须将文件移动到相应的子目录中,其对应关系基于文件名中的数字。这是for我的代码片段中循环使用和其他奇怪之处的原因。

###编辑结束###

有可能通过将一堆文件mv而不是单个文件传递给命令来加速此过程,如下所示:

batch_num=1000

# Counting of files in the directory
shopt -s nullglob
file_list=(files/*)
file_num=${#file_list[@]}

# Every file's common part
suffix='_file.txt'

for((from = 1, to = batch_num; from <= file_num; from += batch_num, …
Run Code Online (Sandbox Code Playgroud)

linux bash ulimit

6
推荐指数
3
解决办法
966
查看次数

在 Linux tty 中不解释回显的转义序列

先决条件

Linux 虚拟终端 (tty) 是VT102 -虚拟终端子系统源的仿真

真正的VT100(几乎与VT102相同)具有以下行为(我想):

  • LINE模式下,所有键入的字符首先传输到计算机,然后返回到终端。从主机返回之前,终端屏幕上不显示任何内容。
  • 转义序列也不例外——它们只有在从主机返回后才会被解析和执行。也就是说,如果我想将字体颜色更改为红色,我应该输入ESC[0;31m,这个序列到计算机,回显,VT102接收到这个,解析并应用。没有其他方法可以更改终端字体颜色(在LINE模式下)。我不确定VT102是否有不同的字体颜色,但这是一个例子。

图片来自手册:

在此处输入图片说明

摘自手册:

线路/本地

LINE/LOCAL 功能允许操作员轻松地将终端置于在线或 LOCAL(离线)状态。当终端在线时(ON-LINE 指示灯亮起),所有在键盘上输入的字符都会直接发送到计算机,并且来自计算机的消息会显示在屏幕上。在LOCAL状态下(LOCAL指示灯亮),终端与电脑断电;消息不会发送到计算机或从计算机接收;键盘上输入的字符直接在屏幕上回显。

资料来源:VT100 系列视频终端技术手册,第三版,1982 年 7 月。


问题

为什么 Linux 的tty行为方式不同?

我把它bash置于睡眠模式,所以它不会干扰,然后输入Esc[0;31m并获得纯文本,颜色没有改变 - 所以,转义序列不起作用。

在此处输入图片说明

几年前我问过类似的问题 -为什么我不能从键盘发送转义序列,但可以从另一个 tty 发送?,但现在我获得了有关VT102 Linux 子系统的知识,并想了解它为什么以这种方式工作 - 在这方面与真正的硬件终端不同。

在此处输入图片说明

linux terminal-emulator tty stty

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

ncurses 转义序列的破译

帮助我破译由ncurses库创建并由 捕获的转义序列strace。我正在探索如何ncurses与终端交互,并想了解它的“握手协议”。我已经找到了一些描述,但并不理解所有描述,例如“将光标键设置为光标”。

echo $TERM印刷xterm-256color

原来的

write(1, "\33[?1049h\33[22;0;0t\33[1;39r\33(B\33[m\33[4l\33[?7h\33[H\33[2J", 46) = 46
write(1, "Hello World !!!", 15)   = 15  
write(1, "\33[39;1H\33[?1049l\33[23;0;0t\r\33[?1l\33>", 32) = 32
Run Code Online (Sandbox Code Playgroud)

我的假设

write(1, "
    \33[?1049h       # go to alternate screen
    \33[22;0;0t
    \33[1;39r
    \33(B            # Set United States G0 character set 
    \33[m            # Turn off character attributes
    \33[4l
    \33[?7h          # Set auto-wrap mode
    \33[H            # Move cursor to upper left corner
    \33[2J           # Clear entire screen
", 46) = 46

write(1, …
Run Code Online (Sandbox Code Playgroud)

terminal ncurses escape-characters

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

为什么我不能从键盘发送转义序列,但可以从另一个 tty 发送?

我试图通过执行不同的技巧来了解终端的工作方式,例如从一个 tty 写入另一个 tty,tty1从更改设置tty2等。此外,我试图通过直接从键盘发送转义序列来更改颜色。也就是说,不是通过echo -e '\e[0;31m'命令,而是通过直接键盘输入。它不起作用。

我执行以下步骤:

  1. 打开tty1tty2
  2. tty2bash进入睡眠模式,通过sleep 10m。输入单词“一”。

在此处输入图片说明

  1. tty1,做echo -n ^[[0;31m > /dev/tty2。第一个字符^[是这样输入的Ctrl+v Esc
  2. 返回到tty2,输入单词“二”。是 - 颜色已被另一个 tty 的命令更改为红色。

在此处输入图片说明

  1. 重复步骤 3,4,但使用绿色和单词“三”

在此处输入图片说明

  1. 最后,我想没有另一个发送转义序列tty,而是直接用电脑键盘-通过打字^[[0;37mtty2。我以同样的方式做所有事情 - EscCtrl+v不需要,因为 readline 正在睡觉),然后[0;37m,但是得到这个:

在此处输入图片说明

问题: 为什么会这样?所有字符都相同,终端状态相同,但在一种情况下终端会获得转义序列,而在另一种情况下则不会。


编辑

这个问题在这里得到了回答:回声转义序列不会在 Linux tty 中解释

terminal tty escape-characters

3
推荐指数
1
解决办法
3227
查看次数

在子shell中继承的变量而不在主shell中导出

我有下面的shell脚本

var="this is a test"

ls -ltr| while read file
do
     echo $var
done
echo $var
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

this is a test
this is a test
this is a test
Run Code Online (Sandbox Code Playgroud)

我如何在 while 循环中将变量“var”的值设置为“这是一个测试”,因为管道将产生一个新的子外壳,而且我也没有在主外壳中导出我的“var”变量?

据我所知,为了让孩子从父 shell 继承变量值,我们需要导出变量,但在这种情况下,变量值在没有“导出”语句的情况下被继承。

shell pipe subshell

3
推荐指数
1
解决办法
1333
查看次数