以下命令在 Linux 中执行什么操作?
ls * > file1
它只是将当前目录中的所有文件名复制到一个新文件中吗?
答案1
这会列出当前目录以及子目录中的所有文件(当前目录下一级,不递归),然后将程序的标准输出重定向ls
到名为的文件file1
答案2
如果您想一次一行地列出当前目录中的所有非隐藏名称,并将该列表写入新文件中list
,请使用
ls >list
这将列出当前目录中的所有名称并将它们写入名为list
.该列表将包含文件本身的名称list
。
如果要包含隐藏名称,请使用ls -a
(或ls -A
不包含.
和..
条目)。
请注意,该list
文件一旦创建,除了用眼睛阅读之外,或多或少没有什么用处,除非您可以保证所有文件名都不包含嵌入的换行符。
您显示的命令包含 shell 在考虑实际命令的作用之前将执行的几个部分。该命令的最终结果取决于 shell 的当前状态、当前目录中文件的名称和类型以及输出文件和当前目录的权限。
file1
首先执行重定向到的操作。如果具有该名称的文件已存在,则该文件将被截断(清空),否则将创建该文件。 shell 稍后会将命令的标准输出流连接到该文件,并且命令的所有输出都将保存在那里。如果该名称
file1
对应于一个目录,如果它对应于一个写保护的文件,或者由于当前目录的权限而无法创建输出文件,那么 shell 将发出错误消息。在这种情况下,它也会在此时停止命令的处理。在 shell 运行该命令之前,它必须找出它的所有参数(请注意,
>
以及后续的参数file1
是不是命令的参数ls
)。在这种情况下,命令行包含不带引号的通配模式*
,并且 shell 将其替换为该模式匹配的名称。默认情况下,*
将匹配当前目录中的所有非隐藏名称。用户可以通过设置各种 shell 选项来修改此设置,以便该模式也匹配隐藏名称,或者根本不考虑该模式进行文件名通配。如果该模式与任何名称都不匹配,则默认情况下它不会展开为文字
*
字符。这取决于当前 shell 中设置的 shell 选项。其他可能的情况包括模式被完全删除或者 shell 发出错误消息并此时停止命令的处理。ls
shell 最后在当前定义的别名、shell 函数和内置实用程序中查找。如果找不到与 对应的名称ls
,它将尝试在变量值列出的目录中查找可执行文件PATH
。如果找不到这样的可执行文件,shell 将发出一条错误消息并停止处理该命令。某些 shell 可能会通过运行各种建议替代拼写的钩子来继续处理已知的命令或建议用户安装正确的软件包等。ls
当找到该命令时,它会给出任何*
可能扩展的内容(取决于当前 shell 会话的设置)作为参数,并且该命令会执行其操作。假设
ls
解析为标准ls
命令,它将依次列出每个参数。这将涉及输出非目录的名称和内容任何目录参数。如果参数是目录的符号链接,则该目录的内容也会被输出。如果
*
在命令行上解析为以破折号开头的内容,则ls
可能会将其解释为选项而不是文件名。这可能会改变命令的结果。如果由于文件名通配已关闭而保持未展开状态,并且当前目录中
*
没有命名的文件(常规文件或其他文件) ,则该命令将在其标准错误流上发出错误消息。*
ls
如果
*
因为它不匹配任何内容而被删除,并且 shell 配置为删除不匹配的模式,则该ls
命令将列出当前目录的内容(可能不会产生任何输出)。由于第一步中处理的重定向,命令在其标准输出流上产生的任何输出都将最终出现在该文件中。