我可以在不使用 cat 的情况下将 shell 函数作为管道有条件地“消失”吗?

2024-02-04

我有一个 bash 脚本,可以从命令管道中生成一些文本。基于命令行选项,我想对输出进行一些验证。举一个人为的例子......

CHECK_OUTPUT=$1
...
check_output()
{
    if [[ "$CHECK_OUTPUT" != "--check" ]]; then
        # Don't check the output. Passthrough and return.
        cat
        return 0
    fi

    # Check each line exists in the fs root
    while read line; do
        if [[ ! -e "/$line" ]]; then
            echo "Error: /$line does not exist"
            return 1
        fi
        echo "$line"
    done
    return 0
}

ls /usr | grep '^b' | check_output

[编辑]更好的例子:https://stackoverflow.com/a/52539364/1888983 https://stackoverflow.com/a/52539364/1888983

这非常有用,特别是当我有多个可以成为直通的函数时。是的,我可以移动 CHECK_OUTPUT 条件并创建一个带有或不带有 check_output 的管道,但我需要为每个组合编写行以获得更多功能。如果有更好的方法来动态构建管道我想知道。

问题是“猫的无用”。这可以避免吗?check_output就像它根本不在管道中一样?


是的,您可以做到这一点 - 通过使您的函数成为有条件注入管道元素的包装器,而不是成为无条件管道元素本身。例如:

maybe_checked() {
  if [[ $CHECK_OUTPUT != "--check" ]]; then
    "$@" # just run our arguments as a command, as if we weren't here
  else
    # run our arguments in a process substitution, reading from stdout of same.
    # ...some changes from the original code:
    #   IFS= stops leading or trailing whitespace from being stripped
    #   read -r prevents backslashes from being processed
    local line # avoid modifying $line outside our function
    while IFS= read -r line; do
      [[ -e "/$line" ]] || { echo "Error: /$line does not exist" >&2; return 1; }
      printf '%s\n' "$line"  # see https://unix.stackexchange.com/questions/65803
    done < <("$@")
  fi
}

ls /usr | maybe_checked grep '^b'

上述代码的警告:如果pipefail设置选项后,您需要检查进程替换的退出状态,以便与其他情况下的行为完全一致。在 bash 版本 4.3 或更高版本 (IIRC) 中,$?通过进程替换来修改以获得相关的PID,可以是waited 用于检索退出状态。

也就是说,这也是一个使用案例cat是可以接受的,我是作为 UUOC 人群中的持卡成员这么说的。 :)


采用约翰·库格曼对相关问题的回答中的示例:

maybe_sort() {
    if (( sort )); then
        "$@" | sort
    else
        "$@"
    fi
}

maybe_limit() {
    if [[ -n $limit ]]; then
        "$@" | head -n "$limit"
    else
        "$@"
    fi
}

printf '%s\n' "${haikus[@]}" | maybe_limit maybe_sort sed -e 's/^[ \t]*//'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在不使用 cat 的情况下将 shell 函数作为管道有条件地“消失”吗? 的相关文章

  • 如何在 bash 中结合超时和 eval 命令

    为了执行存储在变量中的命令eval使用命令 gt a echo e a nb wc l gt eval a 2 但如何才能与它结合起来呢 timeout命令 我尝试过以下操作 这给了我错误的输出 gt timeout 10 a a b wc
  • 通过管道连接到 findstr 的输入

    我有一个文本文件 其中包含宏名称列表 每行一个 我的最终目标是打印宏名称在当前目录的文件中出现的次数 宏的名称位于C temp macros txt type C temp macros txt在命令提示符下可以正常打印列表 现在我想将该输
  • Mac OS X 中 Bash 脚本中的 SFTP 命令

    我需要使用 SFTP 和 SSH 从 Mac 主机将文本文件传输到远程 PC freeSSH 这两个连接在本地网络中 那么有没有办法从 Bash 脚本内部运行 SFTP 命令 使用提供的用户名和密码 我已经尝试过一些脚本expect 但我没
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 如何通过 shell 脚本确定网页是否存在?

    我正在尝试制作一个程序 可以将一系列漫画扫描转换为一个 pdf 文件 并且我不想尝试下载图片来确定我是否有正确的网址 是否有一个 shell 脚本命令可以用来检查网页是否存在 在 NIX 下 您可以使用curl发出一个简单的HEAD要求 H
  • 未找到命令“ember”

    看来我搞砸了 ember cli 安装 我已经使用 sudo 安装了 npm 但是在阅读了 npm 上 ember cli 和 sudo 的一些问题后 我按照此处的说明卸载并重新安装https gist github com isaacs
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • 如何将参数传递给java bash脚本? [复制]

    这个问题在这里已经有答案了 我有一个简单的 bash 脚本来运行我的 java 程序 就这个 run sh bin sh java jar target my jar arch jar 我想将参数传递给这个脚本 该脚本必须将它们传递给jav
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 从 Amazon S3 存储桶下载文件的脚本

    尝试编写脚本以从 Amazon S3 存储桶下载文件 cURL 网站上的示例遇到问题 下面的脚本产生 我们计算的请求签名与您的签名不匹配 假如 检查您的密钥和签名方法 感谢任何帮助 bin sh file filename php buck
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht

随机推荐

  • 如何删除 Rabbitmq 以便我可以重新安装

    我遇到了麻烦 所以我进入注册表并删除了rabbitmq的服务条目 现在 当我尝试重新安装时 它说它已经存在 但无法启动 因为我删除了它 我可以执行以下操作sc delete rabbitmq 如何完全删除它的所有痕迹并从头开始重新安装 我猜
  • 我想扩展 std::string,但不是出于您可能认为的原因

    我有一个有效地接受字符串的方法 但是 我想要使用的字符串子集非常有限 我正在考虑将 std string 作为某个类进行 typedef ing 并显式调用函数 不过 我不确定这是否有效 有想法吗 通常的规则仍然适用 该类不是设计为继承的
  • 检查 iOS 应用程序上的互联网连接,Cordova Phonegap 3.3.0 无法正常工作

    我尝试过以下this http cordova apache org docs en 3 3 0 cordova connection connection md html The 20Command Line 0AInterfaceCor
  • ASP.Net MVC 基于安全性隐藏/显示菜单项

    我正在开发一个 ASP Net MVC 3 网站 Layout 主视图包含一个菜单 我想根据您是否登录以及您所处的角色隐藏菜单中的一些项目 目前使用这样的代码可以工作 if HttpContext Current User Identity
  • MySQL默认值错误与ON DUPLICATE KEY UPDATE

    为什么我会收到此错误 MySQL 版本是否发生了某些变化 导致此操作 曾一度有效 现在失败 INSERT INTO 未指定 user id 值would如果插入已完成 则需要 但由于 id 1 已经存在 因此这应该成为更新并且有效 mysq
  • MassTransit - 等待所有活动完成然后继续处理

    如果我有很多活动 是否会导致资源阻塞或请求超时 这是我的场景 我有一个 api 控制器 它向消费者发送订单请求 我使用请求 响应模式来接收错误信息来自消费者的属性并基于该属性响应返回 如果它为空我想返回OK 否则 返回BadRequest
  • 为 MySql 中的视图生成唯一的长 ID

    我可以看到三张桌子 它有 6 列 如下所示 ID NAME PRINCIPAL ID DESCRIPTION GROUP ID TYPE 正如我正在使用的hibernate要从数据库检索数据 我必须将ID此视图中的列 问题是 我无法生成唯一
  • 有没有办法通过联合访问各个位?

    我正在写一个C程序 我想要一个可以作为字符访问的变量 但我也可以访问其特定位 我想我可以使用这样的工会 typedef union unsigned char status bit bits 8 DeviceStatus 但编译器不喜欢这样
  • Android 警报对话框中可以有垂直按钮吗?

    默认情况下 我们会在警报对话框中看到两个或三个水平对齐的按钮 是否可以让它们在警报对话框中垂直对齐 当然 你可以使用Dialog setContentView 将对话框的内容设置为任意布局 Dialog dialog new Dialog
  • 如何显示Windows 7风格的上下文菜单?

    在我的 NET 应用程序中 上下文菜单与左侧类似 我怎样才能将 Windows 7 风格应用到它们上 使它们看起来像正确的样式 右键单击工具箱 选择项目 勾选 ContextMenu 命名空间 System Windows Forms 且目
  • 改变布局的 Javascript/jQuery focusout 事件导致 click 事件不触发

    我有一个字段 当您将焦点放在它上时 它会更改页面的布局 我的页面上还有提交表单的按钮 如果我进入字段并输入一个值 然后单击按钮 则按钮单击事件永远不会触发 这似乎是因为布局正在改变而发生的before单击事件被触发 这意味着按钮改变了位置
  • MSVC-10 包含路径

    如何指定 MSVC 搜索包含文件的位置 我想将增强标头添加到搜索路径中 我没有使用 Visual Studio 项目 只是使用编译器 您需要将它们编辑到 INCLUDE 环境变量中 您可以通过系统属性属性页找到它 例如 仅限 Windows
  • perlbrew 失败并显示“无法找到 Devel/PatchPerl.pm”

    perlbrew失败了Can t locate Devel PatchPerl pm 更准确地说 失败的是运行patchperl这是由产生的perlbrew There is事实上Devel PatchPerl pm通过环境变量中的路径访问
  • 如何在Android Studio中从默认的ConstraintLayout切换到RelativeLayout

    我有最新的 android Studio 2 3 beta 3 似乎 ConstraintLayout 是创建项目时的默认设置 如何让 Android Studio 使用relativelayout作为新项目的默认布局元素 嗯 我看到了上面
  • ActiveMQ 中的只读 Web 控制台访问

    我正在使用 ActiveMQ 5 10 并且想创建一个通过 Web 控制台具有只读访问权限的用户 红帽发布本文 https access redhat com solutions 389323 提到由于 ActiveMQ 中的错误 它并不是
  • 如何使用彩色置信区间带绘制回归原始比例的回归图?

    我想从线性模型中绘制线条和 95 置信区间 其中响应已按数据的原始比例进行 Logit 转换 因此 结果应该是一条曲线 包括原始尺度上的置信区间 而在 Logit 变换尺度上它将是一条直线 参见代码 Data dat lt data fra
  • 在 firebase 函数中使用 gmail 时出现 Nodemailer 错误

    我正在使用 firebase 云功能 我配置了以下设置 虽然这在我的本地计算机上运行得很好 但在服务器上运行时却给我带来了问题 我在互联网上尝试了无数的解决方法 但没有运气 这有什么问题吗 use strict const function
  • Core Data iPad/iPhone BLOBS 与 20k PDF 的文件系统

    我正在使用核心数据设计一个 iPad iPhone 应用程序 该应用程序的主要功能是排序和查看多达 20 000 个 PDF 每个 PDF 约为 200KB 通常最好不要将 BLOBS 存储在数据库中 但对于桌面系统 我通常看到它说如果 B
  • 保存文件时出现 UnauthorizedAccessException

    我在 Windows 8 C 应用程序中有以下代码 它从服务器获取图像并存储它 private async Task httpFetcher HttpClient httpClient new HttpClient HttpRequestM
  • 我可以在不使用 cat 的情况下将 shell 函数作为管道有条件地“消失”吗?

    我有一个 bash 脚本 可以从命令管道中生成一些文本 基于命令行选项 我想对输出进行一些验证 举一个人为的例子 CHECK OUTPUT 1 check output if CHECK OUTPUT check then Don t ch