捕获 NS3 return/exit 代码(通过 waf)作为 Bash 脚本中的变量

Capturing NS3 return/exit code (through waf) as a variable in Bash script

我想捕获我的 NS3 模拟的 return/exit 代码作为我的 Bash 脚本中的一个变量。

代码

#!/bin/bash

rv=-1    #set initial return value
./waf --run "ns3-simulation-name --simulationInput1=value1 --simInput2=value2"    #run ns3 simulation using waf
rv=$?    #capture return value
echo -e "return value captured from program rv=$rv\n"    #output return value

问题

由于NS3模拟是运行使用wafhttps://gitlab.com/ita1024/waf/),所以模拟的return代码经过waf处理,然后为 bash 脚本生成 0 的 return 代码值,因此 rv 始终设置为零,而不管模拟生成的退出代码如何。


请求

如何将rv的值设为NS3模拟的退出码而不是waf执行的退出码?

对于NS3模拟可以执行哪些C++代码,我有很大的灵活性,包括控制return代码值。

干杯

问题是ns3写的wscript不关心执行程序的return代码

您可以像这样修改 wscript

# near line 1426 on current repository
if Options.options.run:
    rv = wutils.run_program(
        Options.options.run,
        env, 
        wutils.get_command_template(env),                    
        visualize=Options.options.visualize,
   )
   raise SystemExit(rv)

And/or你可以解析模拟的输出来得到你想要的任何值(通常在shell中得到结果的最佳方式,return值只是为了错误处理)。不懂ns3,帮不上忙

我通过使用文件将值从 NS3 传输到 bash 环境,有效地绕过了 waf.

下面是我注释的代码:

Bash

#!/bin/bash
vfn=filename.var   # variable file name
touch $vfn   #create empty file

# Declare and set shell environment variables
export VAR1=-1 
export VAR2=0
export VAR3=1

# Load variables into file called $vfn
for var in VAR1 VAR2 VAR3
    do
        echo "$var="'"'"$(eval echo '$'"$var")"'"'
    done >> $vfn

# Run simulation passing filename $vfn into simulation.
./waf --run "simulation-name --input1=$vfn"    # Custom C++ code in the simulation uses --input1 to update the variable values in the specified file.

# Load updated values from file to the shell environment (variables)
. $vfn 

# --> Use updated values here...

# Delete variables file, as needed.
rm $vfn 

C++上面名为“simulation-name”的 NS3 模拟中的代码

#include <fstream>

// create a filestream object from the name of the file where the variables are stored. (variableFilename equals $vfn)
std::ofstream ofs(variableFilename, std::ofstream::trunc);

// Overwrite existing file with updated variable values using the required format.  
ofs << "VAR1=" << 3 << "\n";
ofs << "VAR2=" << 5 << "\n";
ofs << "VAR3=" << 7 << "\n";

ofs.close();   // close filestream object.