如何否定进程的返回值?

2023-11-27

我正在寻找一个简单但跨平台的negate- 否定进程返回值的进程。它应该将 0 映射到某个值 != 0 并将任何值 != 0 映射到 0,即以下命令应返回“yes,nonexistingpath 不存在”:

ls nonexistingpath | negate && echo "yes, nonexistingpath doesn't exist."

这 ! - 运算符很棒,但不幸的是它不独立于 shell。


Previously, the answer was presented with what's now the first section as the last section.

POSIX Shell 包括!操作员

通过研究 shell 规范的其他问题,我最近(2015 年 9 月)注意到 POSIX shell 支持!操作员。例如,它被列为保留字并且可以出现在a的开头pipeline— 其中简单命令是“管道”的特殊情况。因此,它可以用于if声明和while or until也在 POSIX 兼容的 shell 中循环。因此,尽管我有所保留,但它的应用范围可能比我在 2008 年意识到的更广泛。对 POSIX 2004 和 SUS/POSIX 1997 的快速检查表明,!都存在于这两个版本中。

请注意,!操作员必须出现在开始管道的状态代码并否定整个管道的状态代码(即last命令)。这里有些例子。

# Simple commands, pipes, and redirects work fine.
$ ! some-command succeed; echo $?
1
$ ! some-command fail | some-other-command fail; echo $?
0
$ ! some-command < succeed.txt; echo $?
1

# Environment variables also work, but must come after the !.
$ ! RESULT=fail some-command; echo $?
0

# A more complex example.
$ if ! some-command < input.txt | grep Success > /dev/null; then echo 'Failure!'; recover-command; mv input.txt input-failed.txt; fi
Failure!
$ ls *.txt
input-failed.txt

便携式答案——适用于古董贝壳

在 Bourne(Korn、POSIX、Bash)脚本中,我使用:

if ...command and arguments...
then : it succeeded
else : it failed
fi

这是尽可能便携的。 “命令和参数”可以是管道或其他复合命令序列。

A not command

这 '!'操作符,无论是内置到 shell 中还是由操作系统提供,都不是普遍可用的。不过,编写起来并不难 - 下面的代码至少可以追溯到 1991 年(尽管我认为我在更早之前编写了以前的版本)。不过,我不倾向于在我的脚本中使用它,因为它不可靠。

/*
@(#)File:           $RCSfile: not.c,v $
@(#)Version:        $Revision: 4.2 $
@(#)Last changed:   $Date: 2005/06/22 19:44:07 $
@(#)Purpose:        Invert success/failure status of command
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 1991,1997,2005
*/

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "stderr.h"

#ifndef lint
static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
#endif

int main(int argc, char **argv)
{
    int             pid;
    int             corpse;
    int             status;

    err_setarg0(argv[0]);

    if (argc <= 1)
    {
            /* Nothing to execute. Nothing executed successfully. */
            /* Inverted exit condition is non-zero */
            exit(1);
    }

    if ((pid = fork()) < 0)
            err_syserr("failed to fork\n");

    if (pid == 0)
    {
            /* Child: execute command using PATH etc. */
            execvp(argv[1], &argv[1]);
            err_syserr("failed to execute command %s\n", argv[1]);
            /* NOTREACHED */
    }

    /* Parent */
    while ((corpse = wait(&status)) > 0)
    {
            if (corpse == pid)
            {
                    /* Status contains exit status of child. */
                    /* If exit status of child is zero, it succeeded, and we should
                       exit with a non-zero status */
                    /* If exit status of child is non-zero, if failed and we should
                       exit with zero status */
                    exit(status == 0);
                    /* NOTREACHED */
            }
    }

    /* Failed to receive notification of child's death -- assume it failed */
    return (0);
}

当执行命令失败时,这会返回“成功”,与失败相反。我们可以争论“不成功地采取任何行动”的选择是否正确;也许它应该在没有被要求执行任何操作时报告错误。 '中的代码"stderr.h"' 提供简单的错误报告工具 - 我在任何地方都使用它。根据要求提供源代码 - 请参阅我的个人资料页面与我联系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何否定进程的返回值? 的相关文章

  • 如何在 Bash 中将字符串转换为小写

    有办法进去吗bash questions tagged bash将字符串转换为小写字符串 例如 如果我有 a Hi all 我想将其转换为 hi all 有多种方法 POSIX标准 https en m wikipedia org wiki
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 使用 cURL 从 shell 发布 4GB 文件

    我尝试将文件大小为 4GB 的文件发布到 REST API cURL 不会上传此大小的文件 而是 POST 内容长度为 0 的文件 curl v i d work large png H Transfer Encoding chunked
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • Windows、Emacs、Git Bash 和 shell 命令

    Windows 7 Emacs 24 3 1 git 1 8 1 msysgit 1 我的等效 emacs 文件中有以下内容 if equal system type windows nt progn setq explicit shell
  • 如何在fish shell脚本中获取程序名称?

    在 bash 中 与在 ruby 中一样 程序名称由 0 给出 鱼里有什么 如果有必要 我可以执行以下操作 set PROGRAM ps no header o args p self egrep o S 2 但我确信程序名称必须已经在某个
  • 构建涉及 cmake 的项目,如何使其了解库

    当我尝试在 64 位 linux debian 机器上使用 cmake 和 gcc 构建此项目时 我从链接器中收到错误 Linking C executable cpsadamsx home dala lib64 libSimTKcommo
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 跨平台 UI 工具包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要编写跨平台 GUI 应用程序 我可以使用什么工具包 目前我在 Windows MSVC 和 Linux gcc 中工作 最流行的选择
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 如何通过 shell 脚本确定网页是否存在?

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

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • Mongodb shell mongo:通常只允许每个套接字地址(协议/网络地址/端口)使用一次。对于套接字:0.0.0.0:27017

    前两天还好好的 现在mongod不起作用 甚至echo ps A grep mongo没有打印任何内容 但它警告错误 每个套接字地址只有一种用途 怎么杀掉它 我也尝试过不同的随机端口 他们怎么可能也失败呢 D mongodb win32 x
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while

随机推荐

  • OpenCV:如何从以太网摄像头捕获帧

    我之前对 USB 网络摄像头进行了编程 其唯一目的是从摄像头获取实时帧并显示在窗口中 我使用 cvCaptureFromCAM 来实现此目的 它对于 USB 摄像头效果很好 请参见下面的代码 我想知道如何从千兆以太网摄像头捕获帧 我想我需要
  • C++ 中的重写删除应如何表现?

    我遇到的问题是 据我所知 删除运算符应该是静态函数 但有时编译器 VC 似乎将其视为动态函数 Given class Base public void operator new size t size allocate from custo
  • PHP:使用自动加载器时如何获取所有类

    我正在使用 Composer 生成自动加载器 autoload psr 4 SomeNamespace src SomeDir 我需要创建实现特定接口的所有类的实例 这相当容易但是 当不使用自动加载器时get declared classe
  • Jquery 使用数组中的数据创建选择标签

    我需要访问数据库并更新选择标签的选项 我的代码在这里 window load function getJSON http localhost ABC web app dev php doctorFillOption function dat
  • Silverlight:组合框中的默认值

    我想在组合框中显示默认文本 例如 选择一个人 消息 你能帮我一下吗 请注意 我正在使用域上下文中的数据绑定 谢谢 为了实现这一点 我使用了派生的ExtendedComboBox扩展内置类ComboBox班级 您可以在以下位置找到该类的源代码
  • HL7 FHIR 在 asp.net web api 中序列化为 json

    我正在使用 HL7 Fhirnuget由 Ewout Kramer 创建的软件包 0 9 3 我将其与 ASP NET Web API 绑定在一起 但不幸的是内置的 JSON 序列化无法正确生成 JSON 它包含很多这样的内容
  • 现代CPU会跳过零乘法吗?

    我想知道当两个数字中至少有一个为零时 当前的CPU是否避免将两个数字相乘 谢谢 这根据 CPU 和 在某些情况下 操作数的类型而有很大差异 较旧 较简单的 CPU 通常使用如下乘法算法 integer operator integer co
  • 文本溢出时的选取框文本

    这是我的问题 假设我有 3 个 div 标签 宽度均为 100 像素 lt DIV WIDTH gt Text in div 1 Text in div two it overflows Text in div three lt DIV W
  • NumPy 中的加权标准差

    numpy average 有一个权重选项 但是numpy std 才不是 有人对解决方法有建议吗 下面这个简短的 手动计算 怎么样 def weighted avg and std values weights Return the we
  • C中的查找表

    我正在用 C 创建一个查找表 当我定义这个时 typedef struct char action char message lookuptab lookuptab tab aa bb cc dd 它编译时没有错误 但是当我做这样的事情时
  • 如何从回收站恢复文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 C 从回收站恢复文件 有人知道如何使用 C 和 Windows API 从回收站恢复文件吗 This link可以帮你 using System using System Collectio
  • 视差视图滚动(类似雅虎天气)

    严格来说 这不是一个编程问题 而是更多的 如何完成这个 问题 我很好奇 并且正在开发一个可能需要此功能的应用程序 如何实现左右视差滚动 要准确了解我的意思 请查看雅虎天气应用程序 它是免费的 不用担心 他们是只使用一个视图控制器还是为其中显
  • 如何在CSS中制作渐变边框

    我正在尝试将渐变应用于边框 我认为这就像这样做一样简单 border color moz linear gradient top 555555 111111 但这是行不通的 有谁知道边框渐变的正确方法是什么 The border image
  • 数组“包含”方法在 Google Apps 脚本中失败

    我试图在 Google Apps 脚本中对数组使用 includes 方法 但失败并显示 无法找到对象 1 4 3 7 中包含的函数 第 4 行 文件 test array 以下是代码 function test array var arr
  • Soundpool 还是媒体播放器?

    我正在为 Android 开发一款纸牌游戏 我希望每次投掷纸牌时都能播放投掷声音 这是同一个文件 我还会播放其他声音 例如背景音乐和某些点击声 您建议使用什么 声音池或创建 MediaPlayback 并播放它 每一个的优点 缺点是什么 我
  • 内联静态常量与静态常量变量

    我无法弄清楚哪种解决方案更好 因为我不清楚其中的区别 我想要一个包含一些可以在整个程序中自由使用的变量的文件 我的第一次尝试如下 头文件 Hosts h pragma once include
  • 从 Tkinter 框架调用函数到另一个框架

    我有一个页面 将在其中显示一些客户详细信息 因此 我创建了一个名为 客户详细信息 的页面 其中包含我需要的所有标签 并将这些标签的文本设置为变量 可惜它不起作用 标签创建于 init 方法 所以我无法 更新 它们 因为 init 仅在开始时
  • Android:如何检测assets文件夹中的目录?

    我正在检索这样的文件 String files assetFiles list EngagiaDroid 我们如何知道它是一个文件还是一个目录呢 我想循环访问资产文件夹中的目录 然后复制其所有内容 我认为更通用的解决方案 如果您有子文件夹等
  • 使用 spring-boot-admin-server 时创建名为“conversionServicePostProcessor”的 bean 时出错

    我试图为我的应用程序启用 Spring boot 管理服务器 默认设置工作得很好 但是当我尝试启用安全性时 出现以下错误 应用程序无法启动 描述 bean conversionServicePostProcessor 在类路径中定义 资源
  • 如何否定进程的返回值?

    我正在寻找一个简单但跨平台的negate 否定进程返回值的进程 它应该将 0 映射到某个值 0 并将任何值 0 映射到 0 即以下命令应返回 yes nonexistingpath 不存在 ls nonexistingpath negate