linux - ls -la 和 ls -la > ls-1.txt 的区别

标签 linux bash shell

如果我执行 ls -la,我会得到如下结果

total 16
drwxr-xr-x   4 rockse  staff  136 Apr 28 16:55 .
drwx------+ 23 rockse  staff  782 Apr 28 16:48 ..
-rw-r--r--   1 rockse  staff   32 Apr 28 16:49 1.sh
-rw-r--r--   1 rockse  staff  215 Apr 28 17:01 ls-1.txt

但是如果我执行 ls -la > ls-1.txt,我会得到这个

total 8
drwxr-xr-x   4 rockse  staff  136 Apr 28 16:55 .
drwx------+ 23 rockse  staff  782 Apr 28 16:48 ..
-rw-r--r--   1 rockse  staff   32 Apr 28 16:49 1.sh
-rw-r--r--   1 rockse  staff    0 Apr 28 17:06 ls-1.txt

我知道创建了一个文件,然后将 ls -la 写入相同的文件,但为什么它不在创建之前捕获 ls -la 的快照文件,因为我们只是将标准输出写入文件?

最佳答案

重定向是由 shell 完成的,而不是您正在运行的程序。 shell 为实现这一点所做的处理与此类似(简化):

  1. fork 一个子进程
  2. 打开输出文件
  3. stdout连接到输出文件流
  4. 执行程序

第 2 步创建文件,因此当程序在第 4 步中运行时它将可见。

如果第 2 步在第 4 步之后完成,则无法更改程序的 stdout 以指向它。

关于linux - ls -la 和 ls -la > ls-1.txt 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920068/

相关文章:

linux - shell脚本中的字符串替换

node.js - 在 Emacs nodejs 模式下得到垃圾提示

linux - Bash 脚本变量

php - 如何安装扩展/

Windows Bash 和 Visual Studio Code : How can I launch bash as a run task?

mysql - 如何在 bash 中跟踪上次成功运行

shell - 累积到个人使用awk

linux - 在 bash 脚本中使用 screen

linux - 通过 aws cli 从 codecommit 存储库中提取带有扩展名的文件名

linux - mkdir : missing operand - ssh -tt ${REMOTE_SERVER} sudo sh -c "mkdir -p/opt/migration"