捕获 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模拟是运行使用waf
(https://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.
我想捕获我的 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模拟是运行使用waf
(https://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.