【问题标题】:Bash Script - using cmd instead of catBash 脚本 - 使用 cmd 而不是 cat
【发布时间】: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 &lt;fooawk foo -- cmd 将是 awk
  • 恕我直言,该工具在这里给了你不好的建议,因为 bash 实际上不会让你写 &lt;filename while ...;我不确定while ... done &lt;filename 是否有效,但是对于一个长命令,将输入文件名一直推到最后并不是那么可读。我想这是一个见仁见智的问题,但如果cat 保持管道井然有序,那对我来说是一个很大的优势。
  • 谢谢@IMSoP 我只是在想,对于作为初学者的我来说,cmd &lt; file | 使它看起来像cmd 应该只替换cat。但这意味着从您的角度来看,我的第一个示例并不是糟糕的编程实践。
  • 一个更聪明的工具,或者一个更聪明的 shell 程序员,可能会建议一种不用while read 来构造整行的方法,但这是一个非常方便的习惯用法。

标签: bash cat


【解决方案1】:

删除 |并将结束行设为:

 done < "$1"

【讨论】:

  • &lt;"$1",而是。 &lt;&lt; 将开始一个heredoc。
【解决方案2】:

您的cmd 是整个while cond; do ... done 复合语句,在这种情况下,重定向需要在最后:

while read -r line; do
  echo "$line"; sleep 0.2
done < "$1"

【讨论】:

  • 很好,谢谢!你知道'cmd'代表什么吗?
  • cmd 可以表示任何命令,例如 ps 或 netstat。如果你想在你的循环中处理这个,你会做 netstat |同时读取 -r ....
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多