小编phi*_*raj的帖子

为什么不能反转 while 循环的输入重定向运算符的顺序?

在 Bash 中,您可以将输入重定向操作符移到命令的前面:

cat <<< "hello"
# equivalent to
<<< "hello" cat
Run Code Online (Sandbox Code Playgroud)

为什么你不能对 while 循环做同样的事情?

while read -r line; do echo "$line"; done <<< "hello"
# hello

<<< "hello" while read -r line; do echo "$line"; done
# -bash: syntax error near unexpected token `do'
Run Code Online (Sandbox Code Playgroud)

我觉得这有点令人困惑,因为您可以通过管道进入 while 循环。我做错了什么还是只是一个设计决定?

bash io-redirection syntax

11
推荐指数
1
解决办法
699
查看次数

可以$!在并行运行的脚本中使用时会导致竞争条件吗?

假设我有多个并行运行的 bash 脚本,代码如下:

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!
Run Code Online (Sandbox Code Playgroud)

$!保证给我最近的后台任务的PID该脚本,或者是最近的后台任务在全球范围?我只是好奇,当它返回的 PID 来自另一个脚本中启动的进程时,依赖此功能是否会导致竞争条件。

bash shell-script parallelism

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

管道文件和目录列表到 du 只显示目录的大小?

假设我有一个包含多个子目录的目录,每个子目录都包含一些文件:

1/a.txt
1/b.txt
2/c.txt
2/d.txt
3/e.txt
3/f.txt
Run Code Online (Sandbox Code Playgroud)

我想查看每个文件的大小。请记住,我知道有更简单、更直接的方法可以做到这一点,例如du -a. 我只是想知道为什么以下不起作用,出于教育目的。


我毫无意义的运动

运行find .返回所有文件和目录的列表,所以我尝试像这样管道它:

find . | xargs du
Run Code Online (Sandbox Code Playgroud)

但这只是返回目录 1、2 和 3 的大小。我缺少一些理解,因为在我看来xargs应该将每一行输出映射find到对du.


如果我使用:

find . | xargs du -a
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作,列出所有文件和目录的大小。如果我只使用该-type f选项将文件列表传递给它,它也可以正常工作,因此它与接收与文件混合的目录列表有关。

这里发生了什么?

pipe xargs disk-usage

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