【问题标题】:awk line 3: /dev/sda: No such file or directory [duplicate]awk 第 3 行:/dev/sda:没有这样的文件或目录 [重复]
【发布时间】:2021-05-02 19:01:40
【问题描述】:

我确实觉得自己很愚蠢,但是谁能给我解释一下,为什么会这样:

current="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}'`"
current2="`$current | awk '{print $2}'`"

导致“/dev/sda:没有这样的文件或目录”,而这:

current2="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}' | awk '{print $2}'`"

正在工作,这个:

current="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}'`"
current2="`echo $current | awk '{print $2}'`"

还在工作

【问题讨论】:

  • 一本好书可以解决你的问题stackoverflow.com/questions/19075671/…
  • 问题是管道中的东西(thing1 | thing2)必须是命令(比如echo $currentawk '{print $2}'),而不仅仅是数据片段(比如只是$current)。当您使用$current | ... 时,shell 会尝试将$current 的内容视为命令,但它会失败。此外,您应该双引号引用变量以避免奇怪的解析问题(例如echo "$current" 而不仅仅是echo $current)。 shellcheck.net 会发现其中的一些问题,也会有其他有用的建议。
  • mywiki.wooledge.org/Quotesmywiki.wooledge.org/BashFAQ/082 描述了您目前缺少的两个 shell 编程基础。

标签: linux bash awk


【解决方案1】:

在第一个代码中,current 将代码的结果存储在 `...` 中,因此,字符串类似于 /dev/sda 502...

在下一行,你有`$current` | awk ...。现在,当 shell 看到这一点时,它会将 $current 替换为字符串 /dev/sda ... 并尝试运行它;也就是说,您实际上是在要求 shell 执行 /dev/sda 502...,这会导致错误。

【讨论】:

  • 但是 $current 和 awk 都在 ``
  • 是的,但这不会改变分析。您正在尝试执行 /dev/sda ... | awk ...,这是没有意义的。这类似于您尝试input.txt | awk ...。你宁愿想要cat input.txt | awk ...awk ... input.txt。您不只是将输入文件的名称(或者在您的情况下输入变量$current)写为命令
  • 罗杰,谢谢你花时间帮助我
  • 不客气!很高兴它有帮助。
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2019-12-23
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多