相关疑难解决方法(0)

为什么 POSIX 强制实用程序没有内置到 shell 中?

这个问题的目的是回答好奇心,而不是解决特定的计算问题。问题是:为什么 POSIX 强制实用程序通常不内置到 shell 实现中?

例如,我有一个脚本,它基本上读取一些小文本文件并检查它们的格式是否正确,但由于大量的字符串操作,在我的机器上运行需要 27 秒。这种字符串操作通过调用各种实用程序来创建数千个新进程,因此速度很慢。我非常有信心,如果内置了一些实用程序,即grep, sed, cut,trexpr,那么脚本将在一秒或更短的时间内运行(根据我在 C 中的经验)。

似乎在很多情况下,构建这些实用程序会影响 shell 脚本中的解决方案是否具有可接受的性能。

显然,选择不内置这些实用程序是有原因的。也许在系统级别拥有一个实用程序版本可以避免该实用程序的多个不同版本被各种 shell 使用。我真的想不出还有很多其他原因来保持创建这么多新进程的开销,而且 POSIX 对实用程序的定义足够多,以至于有不同的实现似乎不是什么大问题,只要它们都是 POSIX合规。至少没有像拥有这么多流程的低效率那样大的问题。

shell utilities shell-script posix shell-builtin

48
推荐指数
5
解决办法
4965
查看次数

/proc/<pid>/exe 符号链接与普通符号链接有何不同?

如果我启动一个进程然后删除它的二进制文件,我仍然可以从/proc/<pid>/exe以下位置恢复它:

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我自己创建符号链接,请删除目标并尝试复制:

cp: cannot stat ‘sleep’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

/proc是内核的接口。那么这个符号链接是否实际上指向加载到内存中的副本,但有一个更有用的名称?exe链接究竟是如何工作的?

linux symlink proc

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

标签 统计

linux ×1

posix ×1

proc ×1

shell ×1

shell-builtin ×1

shell-script ×1

symlink ×1

utilities ×1