AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 717991
Accepted
Richie Thomas
Richie Thomas
Asked: 2022-09-21 07:55:51 +0800 CST2022-09-21 07:55:51 +0800 CST 2022-09-21 07:55:51 +0800 CST

为什么有必要在这个 `bash` 脚本中检查 `awk`?

  • 772

我正在阅读“rbenv”Ruby 版本管理器的开源代码,我看到该库的命令之一检查是否已安装gawkawk:

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

但我还在bash文件的最顶部看到了一个 shebang:

#!/usr/bin/env bash

起初我认为awk如果 shebang 保证我们在bash脚本中运行,我们应该能够假设我们可以运行,但后来我发现这awk是一个 UNIX 命令,而不是 shell 命令,并且我们可能正在运行这个脚本非 UNIX 系统(如 Windows)上的文件。从这个链接,我推断出非 UNIX 系统gawk最常见的风格。awk

我是否正确,我们不能假设awk已安装的原因是因为它是一个 UNIX 命令,而且我们可能不在 UNIX 机器上运行?为什么我们还要检查,gawk因为它是我们期望在尚未awk安装的系统(即非 UNIX 系统)上找到的最有可能的替代品?

shell awk
  • 2 2 个回答
  • 62 Views

2 个回答

  • Voted
  1. Ed Morton
    2022-09-21T12:06:06+08:002022-09-21T12:06:06+08:00

    我怀疑他们稍后可能还会awk在他们的代码中使用该变量,例如"$awk" 'script' file,否则他们应该刚刚编写if ! type -p gawk awk >/dev/null 2>&1; then ...error.... 如果他们使用该变量,他们将使用 gawk 或其他 awk,以他们的 PATH 中的第一个为准,如果没有它,他们可能会编写awk 'script' file并可能在他们的 PATH 中更早地错过一个 gawk。

    啊,看起来是正确的,如果你多看一点他们的代码:

      awk="$(type -p gawk awk 2>/dev/null | head -n1)"
      if [ -z "$awk" ]; then
        echo "rbenv: cannot find awk" >&2
        return 1
      fi
    
      # shellcheck disable=SC2016
      "$awk" '
        /^Summary:/ {
          summary = substr($0, 10)
          next
        }
    

    因此,他们真正想做的是在他们的 PATH 中找到 awk 或 gawk 的第一个版本并使用它,如果两者都不存在,则恕我直言,这更像是一种防御性的事后思考。

    • 3
  2. Best Answer
    QuartzCristal
    2022-09-21T14:27:56+08:002022-09-21T14:27:56+08:00

    bash 和 awk(或 gawk)之间没有固定关系,除了两者都是可执行程序,它们可能存在于PATH路径中,并且都是开源的、免费的并且由 GNU 开发。

    一个 GNU 可执行文件可以在 UNIX 系统中完全有效和可用。在 [Solaris 系统中,我通常使用 bash(从操作系统给出的默认列表中多次使用),没问题。并且 bash 符合大多数 POSIX 要求。例如:MacOS 使用 bash 获得 POSIX 认证。

    Linux 是一种努力遵循 UNIX 哲学的操作系统¹。将 GNU 定义为的唯一原因GNU is not Unix是要明确 Linux不是专有的。

    你说:发现awk是一个UNIX命令:是的。它也是一个 Linux 命令。并且在 Linux、Android和数百个版本的操作系统中使用。都是*nix。另外:例如 Windows是的,甚至 Windows 也有可用的 unix 层。而且,是的,GNU awk 是 *nix 系统中最常见的 awk 风格。而且,是的,Windows 是为数不多的非 *nix 系统的操作系统之一。

    可能未安装的原因awk是因为某些系统开发人员可能决定安装nawk(或任何其他可执行文件)作为 的“最佳替代品” awk,即使相似,也与awk(and gawk) 存在差异,这可能会破坏开发人员rbenv所写的内容.

    ¹请不要误入歧途,说 Linux只是一个内核。通常所说的 Linux 是一个由 Linus 开发的内核和一组开源用户工具的操作系统,一般来自 GNU。

    • 1

相关问题

  • grep -v grep 有什么作用

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve