在哪里可以找到 ls 命令的 shell 脚本?

Owe*_*wen 0 shell shell-script directory-structure

我试图了解该ls命令的工作原理,并且我认为有一个 shell 脚本定义ls了文件系统中的某处。这个正确吗?如果是这样,我在哪里可以找到它?

Rah*_*hul 7

ls使用opendir()和 单readdir()步执行目录中的所有文件。如果它需要有关其中之一的更多信息,则调用stat(). 当然,阅读源代码,但一个非常方便的快捷方式是:

# strace ls
Run Code Online (Sandbox Code Playgroud)

有几个评论的关键部分是:

获取目录条目

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 53 entries */, 32768)  = 1744
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
Run Code Online (Sandbox Code Playgroud)

验证 stdout 是字符设备

fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0
Run Code Online (Sandbox Code Playgroud)

将标准输入映射到内存中。(不知道为什么,请参阅来源)

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb73ff000
Run Code Online (Sandbox Code Playgroud)

将目录条目写入 stdout 并进行总结

write(1, "bin  Desktop  Documents  Downloa"..., 91bin  Desktop
Documents  Download  Music  Pictures  Public  public_html  Templates
Videos
) = 91
close(1)                                = 0
munmap(0xb73ff000, 4096)                = 0
close(2)                                = 0
exit_group(0)                           = ?
Run Code Online (Sandbox Code Playgroud)