我可以用C ++编写脚本吗?


最近,我不得不再次/再次投入Linux脚本编程的美好世界。原则上讲,这个问题不是很棘手,但是由于我很少遇到此类任务,因此我每次都会对其进行研究。我可以肯定,明天我会忘记很多东西,一个月后,我将再次在Google上搜索如何做到这一点。问题仍然表明,通常您无需再次编写脚本,而是修改某人已经编写的现有脚本。它可能不是bash,而是sh或其他东西……语法上有所不同,sh的工作原理应该在bash中工作,但并非总是相反。如果有破折号或灰烬?我不知道...这些脚本语言仍然存在差异,并且令人困惑。当然,对我个人而言,脚本调用某些sed或awk时令人吃惊,并且在命令行上有这样的参数,您可以查看它们并感到奇怪。显然,这一切都取决于程序员的资格,但并不是所有事情都适合我。现在我的耐心消失了,我认为从现在开始,我想尝试用C ++编写脚本...

我了解对于真正的系统管理员来说,我的想法似乎有些煽动性。但是为什么不呢?

所以这个想法很简单。我想以与编写常规脚本相同的方式编写c ++脚本,也就是说,脚本的第一行应包含shebang和“解释器”路径的指示:

#!/bin/c++

该脚本的后续各行将只是一个常规的c ++程序。

我必须准备c ++脚本的“解释器”。您可以在任何东西上写它,至少在bash上写(这是最后一次,尽管不完全是)。当然,它将不是解释器,而是编译器。

那就是我所做的:

#!/bin/bash

msg_file=/dev/null
#msg_file=/dev/stdout

tmp_path=$HOME"/.cache/c++/"
mkdir -p $tmp_path
tmp_file=$1".c++"
exe_file=$1".bin"
if test $1 -nt  $tmp_path$exe_file; then
    echo "Need to recompile.." > $msg_file
    tail -n +2 $1 > $tmp_path$tmp_file
    eval "g++ -o $tmp_path$exe_file $tmp_path$tmp_file > /dev/null 2>&1"
    if [ $? -eq 0 ]
    then
	echo "Compiled ok" > $msg_file
    else
	echo "Compile error" > $msg_file
	exit 255
    fi
fi
eval "$tmp_path$exe_file $@1"

该脚本可完成您所需的一切。作为临时文件夹,我选择了〜/ .cache / c ++文件夹。原始脚本将被复制到此文件夹,但不带第一行。这是通过tail命令完成的。新文件的名称将类似于原始脚本,但扩展名为c ++。扩展名为.bin的二进制文件将收集在同一文件夹中。但是,当然,首先,在创建二进制文件时会进行“是否测试”检查。仅当现有二进制文件在时间上相对于原始“脚本”过时时,才进行编译。使用eval命令启动二进制文件,并将所有初始参数传递给它。

需要将此c ++文件复制到/ bin文件夹并使其可执行(chmod a + x)。

我将尝试编写第一个“ C ++脚本”:

#!/bin/c++

#include <stdio.h>
#include <iostream>

using namespace std;

int main( int argc, char *argv[] )
{
    cout << "hello world!\n";
    for( int i=0; i<argc; i++)
    {
	cout << "Param" << i <<  " is " << argv[i] << "\n";
    }
    return 60+argc;
}

该程序仅打印输入参数列表并返回其数字+60。我
运行我的“脚本”:



有效!

如果在C ++代码中出错,则该程序将不会启动,因为它不会编译,但会回显$?将返回255。但这就是预期的结果。

使用c ++提供了巨大的机会。首先,熟悉的语法。其次,诸如std :: vector,std :: map或std :: string之类的标准类是不可替代的东西。同一行-无论您要做什么,查看该行,将其分成子字符串,断开并征服,获取数组。而且我不需要sed或awk。第三,调试器-天哪!真幸福!我有一个脚本的gdb调试器!此外,您可以使用std ::文件系统(如果编译器允许)。你可以继续...

不幸的是,我经常会先这样做,然后我会想:“如果有人已经这样做了,该怎么办?” 实际上,我并不是第一个提出相同想法的人。这是一个示例:https : //github.com/dimgel/cpp-linux-scripts思路相同,实现不同。事实证明,还有其他实现

总的来说,我对自己的非排他性感到有些失望。但是,我寻找了Habr-我没有找到类似的产品。也许至少有人好奇?

All Articles