在Apache httpd 项目的“support/apxs.in”脚本中,@
在#!
. 也就是说,脚本的第一行是:
#!@perlbin@ -w
Run Code Online (Sandbox Code Playgroud)
这是 Perl 的东西还是 UNIX 内核的东西?换句话说,可以使用path/to/script/script_name.in
?
如果没有,那么用#!
?启动脚本的原因是什么?
我将学习如何使用命令行。具体来说,我将使用这本书:“Linux 命令行:完整介绍”。现在,我是否必须使用 Linux 发行版来浏览本书,还是 OS X 就足够了?
如果我需要 Linux 发行版,那么通过 VM 使用它就足够了,还是需要在本地安装它?
我对内存映射文件感到困惑,所以我有几个问题,如果你能帮助我,我会很高兴。
mv
此类文件从一个目录移入另一个目录)有什么意义?我的理解是,由于文件是内存映射的,与文件交互的进程总是写入主内存的预定义区域,当我们打开该文件(例如使用vim
)时,我们读取该区域的 main内存(因此,不涉及磁盘)。因此,无论我们将文件移到何处,它始终都能正常工作,对吗?如果是,在文件系统中移动文件是否有意义?vim
,对其进行一些更改并保存并关闭vim
,会发生什么?我的更改会简单地写入主内存吗?如果是这种情况,使用此文件的其他进程会看到我刚刚所做的更改吗?根据我的经验,当我对文件进行一些更改时,其他进程没有看到我对文件所做的更改vim
。这是什么原因?我想知道为什么一个空目录占用了 4096 字节的空间,我看到了这个问题。据说空间是按块分配的,因此新目录的大小是 4096 字节。
但是我很确定“普通”文件的分配也是分块完成的。至少在Windows 文件系统中是这样,我猜测它至少在 ext* 中必须相似。
现在据我所知,其他类型文件的大小列表,例如文件、符号链接等,都是根据实际大小完成的。因为当我创建一个空文件时,我看到的大小为 0。当键入几个字符时,我将 <字符数> 字节视为大小等。
所以我的问题是,虽然其他文件的分配也是分块完成的,为什么报告目录和文件大小的策略不同?
我认为这个问题已经足够清楚了,但显然不是。我将尝试在这里澄清这个问题。
1)我认为一个目录是:
我将尝试通过以下示例来解释我认为目录是什么。看完后,如果有不对的地方请告知。
假设我们有一个名为mydir
. 假设它包含 3 个文件,分别是:f0
,f1
和f2
. 假设每个文件的长度为 1 个字节。
现在,什么是mydir
?它是一个指向包含以下内容的 inode 的指针:字符串“f0”和f0
指向的 inode 编号。字符串“f1”和f1
指向的 inode 编号。和字符串“f2”和f2
指向的inode编号。(至少这是我认为的目录。如果我错了,请纠正我。)
现在可能有两种计算目录大小的方法:
1)计算mydir
指向的inode的大小。
2) 将内容mydir
指向的 inode 的大小相加。
尽管 1 更违反直觉,但我们假设它是正在使用的方法。(对于这个问题,哪个方法是实际使用的方法并不重要。)然后,mydir
计算的大小如下:
2 + 2 + 2 + 3 * <space_required_to_store_an_inode_number>
Run Code Online (Sandbox Code Playgroud)
2 是因为每个文件名的长度为 2 个字节。 …
我对Ctrl-key
组合在终端中的工作方式感到困惑。在 bash 手册页中,有多种组合,例如:
C-e
- 转到行尾C-f
- 前进一个字符等等。
但是还有一些未记录的快捷方式,例如:
C-j
(OR C-m
) 用于返回键。C-h
退格C-i
用于选项卡等这些快捷方式是否只是忘记记录?或者,因为
C-j
是 LF
C-m
是 CR
C-i
是 Tab
在 ASCII 中,这是某种“默认”行为吗?换句话说,是针对行为C-j
,C-m
并C-i
没有实现由bash的,而是由别的东西吗?
另一个问题是,当我按下C-v
左箭头键时,^[[D
屏幕上会出现。即,ESC-[-d
。但是当我按下 时ESC-[-d
,光标不会向左移动。这是什么原因?
最初,我认为当我按下 时C-j
,键盘直接发送00001010
到内核。但后来我决定事实并非如此,因为使用诸如xev
或 之类的程序evtest
,我观察到按键按下Control
并j
显示为不同的事件。因此,当我按下 时C-j
,键盘不会发送00001010
,但可能会发送多个字节。那么这些多个字节的转换00001010
是在哪里完成的呢?
我正在尝试调试我的 shell 脚本:
content_type='-H "Content-Type: application/json"'
curl $content_type -d "{"test": "test"}" example.com
Run Code Online (Sandbox Code Playgroud)
我了解到这并没有达到我的预期。在此脚本中,传递给curl
(由于$content_type
)的参数是:
-H
"Content-Type:
application/json"
而不是(我所期望的):
-H
Content-Type: application/json
我知道我可以编写如下脚本:
content_type="Content-Type: application/json"
curl -H "$content_type" -d "{"test": "test"}" example.com
Run Code Online (Sandbox Code Playgroud)
它会以这种方式工作,但我想知道是否可以在单个变量中保存包含参数的多个空间。
对于第二个(工作)版本,如果我想排除内容类型,我需要删除两件事:-H
和$content_type
。
但是,我想知道是否可以将选项及其值放入单个实体中,以便排除/包含内容类型将导致删除/添加单个实体。
使用数组是不可移植的,因为 POSIX 中没有数组。
原因是分词。当我们定义content_type
如下时:
content_type='-H "Content-Type: application/json"'
Run Code Online (Sandbox Code Playgroud)
它具有以下价值:
-H "Content-Type: application/json"
Run Code Online (Sandbox Code Playgroud)
当我们引用不带引号的变量(即,$content_type
而不是"$content_type"
)时,扩展值将成为分词的主题。来自bash 手册的分词页面:
shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。
来自同一页面:
shell 将 的每个字符视为
$IFS
分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果 IFS 未设置,或其值恰好为<space><tab><newline>
,则默认...
因此,-H "Content-Type: application/json" …
我正在阅读The Linux Command Line: A Complete Introduction以了解命令行。这本书很棒。但是,对我来说有一个主要问题:每章末尾没有练习/项目让材料沉入其中。
到目前为止,我读过的大多数编程书籍在每章的末尾都有练习/项目,以便让材料深入了解。我在互联网上搜索了“命令行练习”和类似的查询,但没有找到太多内容。
我读到最佳实践是通过让命令行执行您自己的任务来实际使用它。但是目前,我真的想不出使用命令行的有用任务。
那么我应该如何练习让材料下沉呢?或者,我应该使用一本教 Unix shell 并带有章末练习的书吗?
PS:我很确定我可以找到很多shell脚本练习。但是目前,我正在学习第 7 章,而 shell 脚本从第 24 章开始。所以现在,我需要直接在终端上进行练习。
我跑ps -ejH | less
。输出也包括ps
和less
。
是什么原因?我认为它会按如下方式工作:
ps
将运行,它将列出当时存在的所有进程。ps
将被送入less
。但是按照这个逻辑,两者ps
not 都不less
应该出现在ps
.
那么,为什么这些进程包含在 的输出中ps
?ps
工作方式是否与我描述的有所不同?
我不知道“单用户模式”是否是正确的术语,但我继续:
在 GRUB 菜单上,我按下E编辑运行配置。在以 开头的行中linux
,我附加了以下内容:
rw init=/bin/bash
Run Code Online (Sandbox Code Playgroud)
并按下F10。计算机启动到 root shell 而不询问任何密码。
问题是,信号不起作用。例如,当我运行一个命令时,我无法通过按Ctrl+退出该命令C。
这是预期的吗?如果是,这是什么原因,我该如何解决?是否与单用户模式下的终端模拟器有关?