小编Utk*_*tku的帖子

在shebang之后签名?

Apache httpd 项目的“support/apxs.in”脚本中@#!. 也就是说,脚本的第一行是:

#!@perlbin@ -w
Run Code Online (Sandbox Code Playgroud)

这是 Perl 的东西还是 UNIX 内核的东西?换句话说,可以使用path/to/script/script_name.in?

如果没有,那么用#!?启动脚本的原因是什么?

scripting perl shebang

26
推荐指数
1
解决办法
3047
查看次数

我需要 Linux 发行版来学习命令行还是 OS X 就足够了?

我将学习如何使用命令行。具体来说,我将使用这本书:“Linux 命令行:完整介绍”。现在,我是否必须使用 Linux 发行版来浏览本书,还是 OS X 就足够了?

如果我需要 Linux 发行版,那么通过 VM 使用它就足够了,还是需要在本地安装它?

linux command-line osx

12
推荐指数
3
解决办法
3240
查看次数

如何判断文件是否是内存映射的?

我对内存映射文件感到困惑,所以我有几个问题,如果你能帮助我,我会很高兴。

  1. 假设我浏览到文件系统中的一个目录,并且该目录中有一个文件。这个文件是否有可能指向主内存中的一个区域,而不是指向磁盘中的一个区域?
  2. 如果这是可能的,这就是我们所说的“内存映射文件”吗?
  3. 在文件系统中移动此类文件(即将mv此类文件从一个目录移入另一个目录)有什么意义?我的理解是,由于文件是内存映射的,与文件交互的进程总是写入主内存的预定义区域,当我们打开该文件(例如使用vim)时,我们读取该区域的 main内存(因此,不涉及磁盘)。因此,无论我们将文件移到何处,它始终都能正常工作,对吗?如果是,在文件系统中移动文件是否有意义?
  4. 是否有一个命令可以判断文件是否已进行内存映射?
  5. 最后,如果我用 打开一个内存映射文件vim,对其进行一些更改并保存并关闭vim,会发生什么?我的更改会简单地写入主内存吗?如果是这种情况,使用此文件的其他进程会看到我刚刚所做的更改吗?根据我的经验,当我对文件进行一些更改时,其他进程没有看到我对文件所做的更改vim。这是什么原因?

memory files

9
推荐指数
4
解决办法
2万
查看次数

为什么目录的大小报告与其他文件不同?

我想知道为什么一个空目录占用了 4096 字节的空间,我看到了这个问题。据说空间是按块分配的,因此新目录的大小是 4096 字节。

但是我很确定“普通”文件的分配也是分块完成的。至少在Windows 文件系统中是这样,我猜测它至少在 ext* 中必须相似。

现在据我所知,其他类型文件的大小列表,例如文件、符号链接等,都是根据实际大小完成的。因为当我创建一个空文件时,我看到的大小为 0。当键入几个字符时,我将 <字符数> 字节视为大小等。

所以我的问题是,虽然其他文件的分配也是分块完成的,为什么报告目录和文件大小的策略不同?

澄清

我认为这个问题已经足够清楚了,但显然不是。我将尝试在这里澄清这个问题。

1)我认为一个目录是:

我将尝试通过以下示例来解释我认为目录是什么。看完后,如果有不对的地方请告知。

假设我们有一个名为mydir. 假设它包含 3 个文件,分别是:f0,f1f2. 假设每个文件的长度为 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 个字节。 …

ls filesystems files

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

关于控制键快捷键行为的问题

我对Ctrl-key组合在终端中的工作方式感到困惑。在 bash 手册页中,有多种组合,例如:

  • C-e - 转到行尾
  • C-f - 前进一个字符

等等。

但是还有一些未记录的快捷方式,例如:

  • C-j(OR C-m) 用于返回键。
  • C-h 退格
  • C-i 用于选项卡等

这些快捷方式是否只是忘记记录?或者,因为

  • C-jLF
  • C-mCR
  • C-iTab

在 ASCII 中,这是某种“默认”行为吗?换句话说,是针对行为C-jC-mC-i没有实现bash的,而是由别的东西吗?

另一个问题是,当我按下C-v左箭头键时,^[[D屏幕上会出现。即,ESC-[-d。但是当我按下 时ESC-[-d,光标不会向左移动。这是什么原因?

编辑:

最初,我认为当我按下 时C-j,键盘直接发送00001010到内核​​。但后来我决定事实并非如此,因为使用诸如xev或 之类的程序evtest,我观察到按键按下Controlj显示为不同的事件。因此,当我按下 时C-j,键盘不会发送00001010,但可能会发送多个字节。那么这些多个字节的转换00001010是在哪里完成的呢?

bash keyboard-shortcuts terminal escape-characters

7
推荐指数
1
解决办法
238
查看次数

制作数据库在哪里?

我不知道为什么 Google 搜索没有显示任何内容。从文档

make程序使用 makefile 数据库和文件的最后修改时间来决定哪些文件需要更新。

那么,这个数据库在哪里呢?或者我错过了什么?

make

7
推荐指数
1
解决办法
686
查看次数

在单个变量中保存包含参数的多个空格?

我正在尝试调试我的 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)的参数是:

  1. -H
  2. "Content-Type:
  3. application/json"

而不是(我所期望的):

  1. -H
  2. 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" …

shell shell-script variable

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

如何练习命令行?

我正在阅读The Linux Command Line: A Complete Introduction以了解命令行。这本书很棒。但是,对我来说有一个主要问题:每章末尾没有练习/项目让材料沉入其中。

到目前为止,我读过的大多数编程书籍在每章的末尾都有练习/项目,以便让材料深入了解。我在互联网上搜索了“命令行练习”和类似的查询,但没有找到太多内容。

我读到最佳实践是通过让命令行执行您自己的任务来实际使用它。但是目前,我真的想不出使用命令行的有用任务。

那么我应该如何练习让材料下沉呢?或者,我应该使用一本教 Unix shell 并带有章末练习的书吗?

PS:我很确定我可以找到很多shell脚本练习。但是目前,我正在学习第 7 章,而 shell 脚本从第 24 章开始。所以现在,我需要直接在终端上进行练习。

linux command-line shell bash

5
推荐指数
2
解决办法
7993
查看次数

为什么`ps -e | less` 在进程中显示“少”?

我跑ps -ejH | less。输出也包括psless

是什么原因?我认为它会按如下方式工作:

  1. 首先,ps将运行,它将列出当时存在的所有进程。
  2. 然后, 的输出ps将被送入less

但是按照这个逻辑,两者psnot 都不less应该出现在ps.

那么,为什么这些进程包含在 的输出中psps工作方式是否与我描述的有所不同?

pipe ps

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

Ctrl + C 在 Linux 上的单用户模式下不起作用

我不知道“单用户模式”是否是正确的术语,但我继续:

在 GRUB 菜单上,我按下E编辑运行配置。在以 开头的行中linux,我附加了以下内容:

rw init=/bin/bash
Run Code Online (Sandbox Code Playgroud)

并按下F10。计算机启动到 root shell 而不询问任何密码。

问题是,信号不起作用。例如,当我运行一个命令时,我无法通过按Ctrl+退出该命令C

这是预期的吗?如果是,这是什么原因,我该如何解决?是否与单用户模式下的终端模拟器有关?

linux signals grub2 console

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