在一个相关的问题中,我问到哪里可以找到C函数的文档"等待".这是尝试找出commands.getstatusoutput()模块的返回码.Stackoverflow通过,但文档没有帮助.这就是困扰我的:
#!/usr/bin/python
import commands
goodcommand = 'ls /'
badcommand = 'ls /fail'
status, output = commands.getstatusoutput(goodcommand)
print('Good command reported status of %s' % status)
status, output = commands.getstatusoutput(badcommand)
print('Bad command reported status of %s' % status)
Run Code Online (Sandbox Code Playgroud)
在OS X(Leopard)上运行时,我得到以下输出:(符合文档.)
$ python waitest.py
Good command reported status of 0
Bad command reported status of 256
Run Code Online (Sandbox Code Playgroud)
在OS X上,执行"ls/fail; echo $?" 得到以下输出:
$ ls /fail ; echo $?
ls: /fail: No such file or directory
1
Run Code Online (Sandbox Code Playgroud)
在Linux(Ubuntu Hardy)上运行时,我得到以下输出:
$ python waitest.py
Good …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人知道有条件地执行程序的方法取决于前一个程序的退出成功/失败.如果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命令提示符)我需要调整,但如果有更清洁的方法,我很想知道.
我想为我的安装设置退出代码,这样我就知道为什么安装被中止了.我正在使用Inno Setup.
我正在尝试从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切换回原始状态.
那么,还有更优雅的解决方案吗?
我对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一些,但仍然没有弄清楚.如何利用这个?哪里可以参考这个?
谢谢.
我有一个脚本,检查以下功能的退出状态:
function is_git_repository {
git branch &> /dev/null
}
Run Code Online (Sandbox Code Playgroud)
0如果您使用的是git仓库,那么会返回,128如果您不是.
我测试返回值是否有问题0; 以下按预期工作:
if is_git_repository ; then
echo you are in a git repo
else
echo you are NOT in a git repo
fi
Run Code Online (Sandbox Code Playgroud)
但是,当我试图测试退出状态时,除了0我遇到问题时,这是其他任何事情.我尝试了以下,但没有一个工作:
if [[ "$(is_git_repository)" != "0" ]] ; ...总是评估为真(链接)if [[ "$(is_git_repository)" -ne "0" ]] ; ... 总是评估为假if [[ "$(is_git_repository)" != 0 ]] ; ... 总是评估为真if [[ "$(is_git_repository)" -ne 0 ]] ; ... 总是评估为假if …手册页atexit(3)说明如下:
POSIX.1-2001表示不定义调用的结果
exit(3)(即,exit(3)在使用注册的函数内调用atexit()).在某些系统(但不是Linux)上,这可能会导致无限递归; 便携式程序不应exit(3)在使用注册的函数内调用atexit().
但是,我有兴趣在我的程序的终结器中修改退出代码.我设法做到这一点的唯一方法是exit()从我的终结函数中调用,但是手册页明确警告不要这样做.
这样做有什么实际危险吗?是否有任何实现方法可能导致问题?更好的是,还有另一种方法吗?
我有一个控制台应用程序.与此应用程序的交互是通过TCP/IP完成的.
我也有一个测试框架,它基本上是BATCH脚本的集合(...不是我的错).这个测试框架对每个测试的作用基本上是这样的:
start /min "myapplication.exe" 并等到收到应用程序启动并运行的验证.我目前遇到的一个问题是,由于某些内部错误,应用程序会过早退出.我想区分失败的测试和应用程序崩溃.我对此的唯一指示是应用程序的退出代码.
所以,我尝试了以下内容:
start /min cmd /c "myapplication.exe || echo %errorLevel% > exitcode.txt"
然后在测试脚本中,
if exist exitcode.txt (
set /p exitcode=<exitcode.txt
echo ERROR: myapplication.exe returned exitcode %exitcode%.
goto error
) else (
goto do_processing
)
Run Code Online (Sandbox Code Playgroud)
但由于一些奇怪的原因,文本文件永远不会出现,即使我有时会得到关于应用程序崩溃的对话框,即使我强行使用已知的非零退出代码使其失败.测试刚刚结束do_processing,(当然)导致失败.
编辑 当我跑
start /min cmd /c "nonsense || echo %errorLevel% > test.txt"
我有时会得到一个包含字符串9009的文本文件,但有时候该文本文件包含字符串0,或者有时候1,......有什么......?!
EDIT2 如果输入
cmd /k "nonsense || echo %errorLevel%"
(注意/k选项),你看到0在新窗口中打印,但如果你打字echo %errorlevel%,你得到1 …
windows batch-file command-prompt exit-code console-application
我有一个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设置中,有没有办法让多个容器具有不同的生命周期?如果有,怎么样?
我想捕获Gradle任务的返回码.这是一个执行任务的小型bash脚本草稿:
#!/bin/bash
gradlew_return_code=`./gradlew assembleDebug`
echo ">>> $gradlew_return_code"
if [ "$gradlew_return_code" -eq "0" ]; then
echo "Gradle task succeeded."
else
echo "Gradle task failed."
fi
Run Code Online (Sandbox Code Playgroud)
该脚本不存储返回值,而是在摇篮任务的整个控制台输出.
请注意,示例脚本是一个更复杂的脚本的简化,我需要捕获返回值.
exit-code ×10
bash ×2
shell ×2
atexit ×1
batch-file ×1
c ×1
codeigniter ×1
command ×1
docker ×1
exit ×1
fig ×1
gradle ×1
if-statement ×1
inno-setup ×1
operators ×1
perl ×1
php ×1
powershell ×1
python ×1
stderr ×1
stdout ×1
subprocess ×1
windows ×1