我想知道是否有人知道有条件地执行程序的方法取决于前一个程序的退出成功/失败.如果program1在没有测试LASTEXITCODE变量的情况下成功退出,有没有办法在program1之后立即执行program2?我尝试使用-band和-and运算符无济于事,尽管我觉得它们无论如何都不会工作,最好的替代品是分号和if语句的组合.我的意思是,当在Linux上从源代码自动构建一个包时,&&运算符不能被打败:
# Configure a package, compile it and install it
./configure && make && sudo make install
Run Code Online (Sandbox Code Playgroud)
假设我实际上可以在PowerShell中使用相同的构建系统,PowerShell将要求我执行以下操作:
# Configure a package, compile it and install it
.\configure ; if ($LASTEXITCODE -eq 0) { make ; if ($LASTEXITCODE -eq 0) { sudo make install } }
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用多行,将其保存在文件中并执行脚本,但其目的是简洁(保存击键).也许它只是PowerShell和Bash之间的区别(甚至是支持&&运算符的内置Windows命令提示符)我需要调整,但如果有更清洁的方法,我很想知道.
我正在尝试从Perl脚本检查SVN标记是否存在.所以我尝试调用svn info $url,读取退出代码并禁止标准输出和标准错误流.但是,我很难优雅地做到这一点(可能有更好的方式向SVN询问标签,但这不是重点:)
my $output = `svn info $url/tags/$tag`;
Run Code Online (Sandbox Code Playgroud)
这会在输入时抑制输出$output.退出代码丢失.
my $output = `svn info $url/tags/$tag 2>&1`;
Run Code Online (Sandbox Code Playgroud)
这会抑制STDERR和STDOUT并将它们都放入$output.退出代码再次丢失.
my $exitcode = system("svn", "info", "$url/tags/$tag");
Run Code Online (Sandbox Code Playgroud)
这会捕获退出代码,但实际的输出和错误流对用户可见.
open( STDERR, q{>}, "/dev/null" );
open my $fh, q{>}, "/dev/null";
select($fh);
if (system("svn", "info", "$url/tags/$tag") != 0) {
select(STDOUT);
print ("Tag doesn't exist!");
do_something_with_exit();
}
select(STDOUT);
print "Exit code: $exitcode";
Run Code Online (Sandbox Code Playgroud)
这会杀死STDOUT和STDERR并捕获退出代码,但它很难看,因为我必须记住将STDOUT切换回原始状态.
那么,还有更优雅的解决方案吗?
我使用R的pipe()函数来捕获shell命令的输出,但我也希望从命令中获取退出代码.
我知道我可以system2在这里使用,但我需要管道的优势,即能够以流方式处理输出.
我正在考虑编写自己的库来包装popen()和pclose()C函数,以利用pclose()返回退出状态的事实,但也许这可以避免.
有什么建议?谢谢!
注意
有一些方法可以使用临时文件,命名管道等来实现这一点,但我最好还是避免这些解决方法.我愿意在其中编译一个带有R-> C函数的共享库(我甚至愿意复制粘贴部分R源代码),但我不愿意重建R.
更新
我开始阅读R源代码,发现未经检查的pclose调用:
在src/main/connections.c:
static void pipe_close(Rconnection con)
{
pclose(((Rfileconn)(con->private))->fp);
con->isopen = FALSE;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用实现R_pclose复制R代码的C函数的方法,close()但保存此返回值.我很遗憾地遇到了这个静态变量src/main/connections.c
static Rconnection Connections[NCONNECTIONS];
Run Code Online (Sandbox Code Playgroud)
因为我必须运行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.so才能访问变量,看起来我最好的解决方案是使用我自己的补丁重建R来捕获pclose返回值.
我对C,C++或任何比PHP更低级别一无所知.我在github上看了一下Codeigniter 3代码并发现它添加了退出状态代码常量,即我们可以这样做:
exit(EXIT_DATABASE)手段exit(8)或exit(EXIT_UNKNOWN_CLASS)手段exit(5)
有什么不同
echo 'Configuration file not found';
exit(3);
Run Code Online (Sandbox Code Playgroud)
只是
exit('Configuration file not found'); ?
exit(integer)在php 中使用的目的是什么?它没有打印任何东西,是吗?我也检查了文档和google一些,但仍然没有弄清楚.如何利用这个?哪里可以参考这个?
谢谢.
手册页atexit(3)说明如下:
POSIX.1-2001表示不定义调用的结果
exit(3)(即,exit(3)在使用注册的函数内调用atexit()).在某些系统(但不是Linux)上,这可能会导致无限递归; 便携式程序不应exit(3)在使用注册的函数内调用atexit().
但是,我有兴趣在我的程序的终结器中修改退出代码.我设法做到这一点的唯一方法是exit()从我的终结函数中调用,但是手册页明确警告不要这样做.
这样做有什么实际危险吗?是否有任何实现方法可能导致问题?更好的是,还有另一种方法吗?
我对这个论坛很新,所以我首先要感谢你在我成为会员之前为我提供解决方案:).
所以我有这个代码:
for %%a in ("%PBpath%") do (
move "network location 1 files" "network location 2" >NUL
if ERRORLEVEL 0 (echo Diagram %%~na.pdf was successfuly archived) else ( echo Diagram %%~na.pdf was not archived )
ECHO.%errorlevel%
)
Run Code Online (Sandbox Code Playgroud)
问题是我无法得到不同于0的错误级别.即使要从位置丢失要复制的文件,我仍然可以回显成功存档的消息.我在论坛上搜索了类似的问题,但由于某些原因我无法使其工作.copy和ping命令之间是否有不同之处(ping命令在errorlevel中返回正确的退出代码),因为我无法通过复制或移动来获取它...
谢谢!安德鲁
我正在构建的应用程序在使用后关闭后仍在内存中运行(在任务管理器中检查)Application.Exit().正因为如此,当我如上所述关闭它后再次运行它时,我收到此错误"一次只有一个实例".你能告诉我如何完全关闭我的申请吗?
如何在不改变其行为方式的情况下强制退出代码为零cmd命令
linux相当于什么意思
netstat -an | grep 12035 || true
Run Code Online (Sandbox Code Playgroud)
我试过的东西是
C:\>netstat -ano | find "25000" | exit 0
Run Code Online (Sandbox Code Playgroud)
虽然它强制退出代码0,但在成功时它不会显示所需的输出
例如:
C:\>netstat -ano | find "25000"
TCP 0.0.0.0:25000 0.0.0.0:0 LISTENING 4832
C:\>netstat -ano | find "25000" | exit 0
Run Code Online (Sandbox Code Playgroud)
知道是否有办法?
我有一个docker compose设置数据库容器,一个应用程序容器和一个容器,它预先加载数据库所需的数据.
我希望启动所有容器,docker-compose up同时预装容器在完成工作后终止exit 0.
但是终止这个容器会使用以下消息完成整个设置:
composesetup_load_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping composesetup_app_1...
Stopping composesetup_db_1...
Run Code Online (Sandbox Code Playgroud)
在一个docker-compose设置中,有没有办法让多个容器具有不同的生命周期?如果有,怎么样?
在 shell 脚本中,我使用带有大括号的代码块将所有输出通过管道传输到控制台和带有 tee 的日志文件。
#!/bin/bash
{
echo "Foo bar"
echo "foo bar on STDERR" >&2
ERRL=66
exit 99
} 2>&1 | tee log-file.log
Run Code Online (Sandbox Code Playgroud)
(这只是一个小演示脚本,原来的要复杂得多)
问题是,该行exit 99没有效果,脚本以退出代码 0 结束。(我认为这是 tee 命令的退出代码)
exit $ERRL我尝试在脚本末尾添加该行,但它显示变量 $ERRL 在大括号之外为空。
当代码块内出现问题时,我能做什么以错误代码结束脚本——而不丢失日志文件的输出?