这
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 …
我正在使用videotest和vbetest程序检查 grub 菜单中不同的视频分辨率,并且grub在使用此程序后无法返回命令行。系统没有响应 - 就像挂了一样。只有 Virtualbox 的“关闭机器”有帮助。
问题:如何退出这种模式?可能是我使用这个程序的错误方式?
我的行动:
我知道目录是一个包含行类型为“名称 = 节点编号”的文件。
当我请求像 /home/my_file.txt 这样的路径时,会发生以下步骤:
问题:如果主目录是另一个文件系统的挂载点,驻留在另一个块设备上,这个过程有何不同?当系统理解时,这个目录是挂载点,它是如何做到的?这些信息存储在哪里 - 在 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,它位于另一个文件系统和另一个块设备中。
当我在控制台(不是终端模拟器)中时(使用Ctrl+ Alt+后F_,AltGr+key组合不起作用。
我正在使用捷克语键盘布局(与许多布局一样)将各种特殊字符映射到AltGr+key组合(我相信有时称为死键)。例如,我可以|通过输入AltGr+ w(AltGr是右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) 例如,我有通过这种方式创建的多个文件的目录:
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 虚拟终端 (tty) 是VT102 -虚拟终端子系统源的仿真。
真正的VT100(几乎与VT102相同)具有以下行为(我想):
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 子系统的知识,并想了解它为什么以这种方式工作 - 在这方面与真正的硬件终端不同。
帮助我破译由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) 我试图通过执行不同的技巧来了解终端的工作方式,例如从一个 tty 写入另一个 tty,tty1从更改设置tty2等。此外,我试图通过直接从键盘发送转义序列来更改颜色。也就是说,不是通过echo -e '\e[0;31m'命令,而是通过直接键盘输入。它不起作用。
我执行以下步骤:
tty1和tty2tty2放bash进入睡眠模式,通过sleep 10m。输入单词“一”。tty1,做echo -n ^[[0;31m > /dev/tty2。第一个字符^[是这样输入的Ctrl+v Esctty2,输入单词“二”。是 - 颜色已被另一个 tty 的命令更改为红色。tty,而是直接用电脑键盘-通过打字^[[0;37m在 tty2。我以同样的方式做所有事情 - Esc(Ctrl+v不需要,因为 readline 正在睡觉),然后[0;37m,但是得到这个:问题: 为什么会这样?所有字符都相同,终端状态相同,但在一种情况下终端会获得转义序列,而在另一种情况下则不会。
编辑
这个问题在这里得到了回答:回声转义序列不会在 Linux tty 中解释。
我有下面的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 继承变量值,我们需要导出变量,但在这种情况下,变量值在没有“导出”语句的情况下被继承。