在 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 脚本,代码如下:
#!/bin/bash
tail -f /dev/null &
echo "pid is "$!
Run Code Online (Sandbox Code Playgroud)
为$!
保证给我最近的后台任务的PID该脚本,或者是最近的后台任务在全球范围?我只是好奇,当它返回的 PID 来自另一个脚本中启动的进程时,依赖此功能是否会导致竞争条件。
假设我有一个包含多个子目录的目录,每个子目录都包含一些文件:
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
选项将文件列表传递给它,它也可以正常工作,因此它与接收与文件混合的目录列表有关。
这里发生了什么?