【发布时间】:2017-12-29 09:57:59
【问题描述】:
我写了一个脚本,包括这个循环:
#!/bin/bash
cat "$1" | while read -r line; do
echo "$line"; sleep 2;
done
shellcheck 运行发出以下消息:
SC2002:没用的猫。考虑'cmd
我把脚本改成:
#!/bin/bash
cmd < "$1" | while read -r line; do
echo "$line"; sleep 2;
done
但现在 bash 退出时:
cmd:找不到命令
我做错了什么?
【问题讨论】:
-
cmd是您真正正在运行的东西的占位符。在这种情况下,这就是while循环。 -
所以,如果你正在运行
cat foo | awk,它会告诉你运行awk <foo或awk foo--cmd将是awk。 -
恕我直言,该工具在这里给了你不好的建议,因为 bash 实际上不会让你写
<filename while ...;我不确定while ... done <filename是否有效,但是对于一个长命令,将输入文件名一直推到最后并不是那么可读。我想这是一个见仁见智的问题,但如果cat保持管道井然有序,那对我来说是一个很大的优势。 -
谢谢@IMSoP 我只是在想,对于作为初学者的我来说,
cmd < file |使它看起来像cmd应该只替换cat。但这意味着从您的角度来看,我的第一个示例并不是糟糕的编程实践。 -
一个更聪明的工具,或者一个更聪明的 shell 程序员,可能会建议一种不用
while read来构造整行的方法,但这是一个非常方便的习惯用法。