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 / 问题 / 727972
Accepted
alper
alper
Asked: 2022-12-11 04:25:35 +0800 CST2022-12-11 04:25:35 +0800 CST 2022-12-11 04:25:35 +0800 CST

如何将 else 用于 `ifne`?

  • 772

ifne- 如果标准输入不为空则运行命令

如果可能的话,如果标准输入也为空,我想运行命令;的其他部分ifne。

$ printf "hello" | ifne echo "world" 
world

如果标准输入为空,我想以不同的语句结束。

$ printf "" | ifne echo "world" || echo "else"但它什么都不打印。有可能else吗ifne?

bash
  • 4 4 个回答
  • 46 Views

4 个回答

  • Voted
  1. Kamil Maciorowski
    2022-12-11T05:24:27+08:002022-12-11T05:24:27+08:00
    ( ifne -n sh -c 'exec >&3; echo else' | ifne echo world ) 3>&1
    

    如果标准输入不为空,则ifne -n不会运行sh …,它的作用类似于cat将输入传递给第二个ifne。第二个ifne将运行echo world。这很简单。

    如果标准输入为空则ifne -n运行sh …。我们不能只使用ifne -n echo else | …,因为那样else会得到第二个ifne,我们也会得到world。因此,我们3>&1以前甚至可以使用整个片段的标准输出|。它作为文件描述符 3 可用。ifne -n echo else >&3 | …将打破非空输入的情况,其中数据必须从ifne -n到ifne。为了得到我们想要的,我们需要重定向echo而不是ifne -n自身;因此是内壳。

    您可以替换echo else为其他命令。您可以替换为另一个命令(如果您需要多个命令echo word,则可能是这样)。sh -c …我的观点是这个答案不依赖于else或world正在打印;替代品可能会或可能不会沉默,这并不重要。

    • 2
  2. Best Answer
    Stewart
    2022-12-11T04:33:06+08:002022-12-11T04:33:06+08:00

    从手册页:

    -n 反向操作。如果标准输入为空,则运行命令。请注意,如果标准输入不为空,则在这种情况下通过 ifne 传递。

    $ printf "not-empty\n" | ifne    printf "This will print\n"
    This will print
    $ printf ""            | ifne    printf "This will not print\n"
    $ printf "not-empty\n" | ifne -n printf "This will not print\n"
    not-empty
    $ printf ""            | ifne -n printf "This will print\n"
    This will print
    

    这使您可以执行以下操作:

    $ dosoemthing | ifne -n printf "There was no output"
    

    如果您正在寻找一种 if-then-else 类型的解决方案,您可以将 stdout 通过管道传输到teecan call 的两个实例中ifne:

    $ printf "if\n" | tee >(ifne printf "then\n") | ifne -n printf "else\n"
    if
    then
    $ printf ""     | tee >(ifne printf "then\n") | ifne -n printf "else\n"
    else
    

    但是您也确实打印了原始标准输出。这就是通过的ifne -n过程。

    • 1
  3. Stéphane Chazelas
    2022-12-11T09:49:23+08:002022-12-11T09:49:23+08:00

    作为对现有答案的补充,请注意,它ifne通过尝试从 stdin 读取来工作,如果有什么东西来了,它会启动命令并通过管道循环将数据铲到它。

    然而,对于大多数类型的输入,应该可以检测是否有一些输入而无需读取它,这将节省提取处理并避免管道。

    例如,您可以定义一个:

    input_available() {
      perl -MIO::Poll -e '
        $p = IO::Poll->new;
        $p->mask(STDIN, POLLIN);
        $p->poll or die "poll: $!\n";
        exit(1) unless $p->events(STDIN) & POLLIN;
        require "sys/ioctl.ph";
        $n = pack("L", 0);
        ioctl(STDIN, &FIONREAD, $n) or die"ioctl: $!\n";
        $n = unpack("L", $n);
        exit(1) unless $n > 0'
    }
    

    然后,你可以这样做:

    some-command |
      if input_available; then
        echo Input available:
        cat
      else
        echo No input available
      fi
    

    poll()在 LinuxPOLLIN上,仅当有一些数据时才在管道上标记,但并非所有系统都是这种情况,因为有些系统还在文件末尾标记 POLLIN。因此 FIONREAD ioctl 检查是否确实有数据。ioctl 不适用于所有类型的输入。例如在 Linux 上,我发现它在/dev/null. 至少它确实适用于常规文件、管道和 tty 设备。

    • 1
  4. Kusalananda
    2022-12-11T10:07:23+08:002022-12-11T10:07:23+08:00

    流水线

    somecommand | ifne echo something
    

    something...如果somecommand写入标准输出,则产生输出(字符串)。

    如果管道不产生任何输出,somecommand则不产生任何输出。这可能被捕获ifne -n:

    somecommand | ifne echo something | ifne -n echo nothing
    

    测试:

    $ printf 'ok' | ifne echo something | ifne -n echo nothing
    something
    $ printf '' | ifne echo something | ifne -n echo nothing
    nothing
    

    请注意,这会丢弃管道中最左侧命令的输出。这可以通过使用类似的东西来补救

    ifne sh -c 'cat;echo something'
    

    ...作为管道的第二个命令,cat应该从左侧接收输出的任何命令在哪里。

    这也依赖于这样一个事实,即在第一个命令不产生任何输出的情况下,最后一个命令没有任何输入。

    • 1

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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