
#!/bin/c++
As linhas subsequentes do script serão apenas um programa c ++ regular.Eu tenho que preparar o "intérprete" do script c ++. Você pode escrever em qualquer coisa, pelo menos no bash (esta é a última vez, embora não exatamente). Obviamente, não será um intérprete, mas um compilador.Isso é o que eu fiz:#!/bin/bash
msg_file=/dev/null
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"
Este script faz tudo o que você precisa. Como pasta temporária, escolhi a pasta ~ / .cache / c ++. O script original será copiado para esta pasta, mas sem a primeira linha com shebang. Isso é feito pelo comando tail. O nome do novo arquivo será como o script original, mas com a extensão c ++. O binário com a extensão .bin será coletado na mesma pasta. Mas primeiro, é claro, uma verificação "se teste" é feita no momento em que o binário é criado. A compilação ocorre apenas se o binário existente estiver desatualizado no tempo em relação ao "script" original. O binário é iniciado com o comando eval e todos os parâmetros iniciais são passados para ele.Esse arquivo c ++ precisa ser copiado para a pasta / bin e o torna executável (chmod a + x).Vou tentar escrever meu primeiro "script 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;
}
Este programa simplesmente imprime uma lista de parâmetros de entrada e retorna seu número + 60. Eucorro meu "script": Funciona !!!Se você cometer um erro no código c ++, o programa não será iniciado, pois não será compilado, mas ecoará $? retornará 255. Mas era isso que se pretendia.O uso do c ++ oferece enormes oportunidades. Primeiro, a sintaxe familiar. Em segundo lugar, classes padrão como std :: vector, std :: map ou std :: string e outras são coisas insubstituíveis. A mesma linha - o que você quiser fazer com ela, procure na linha, divida-a em substrings, desconecte e conquiste, obtenha matrizes. E eu não preciso nem do sed nem do awk. Terceiro, o depurador - Deus! que benção! Eu tenho um depurador gdb para o script! Além disso, você pode usar o std :: filesystem (se o compilador permitir). Você pode continuar ...Infelizmente, muitas vezes acontece comigo que eu o farei primeiro e depois pensarei: "e se alguém já fez isso?" E, de fato, não sou o primeiro a ter a idéia de fazer o mesmo. Aqui está um exemplo: https://github.com/dimgel/cpp-linux-scripts a idéia é a mesma, a implementação é diferente. Acontece que existem outras implementações .Em geral, senti uma pequena decepção por minha própria não exclusividade. No entanto, procurei por Habr - não encontrei um semelhante. Talvez alguém pareça pelo menos curioso?
Funciona !!!Se você cometer um erro no código c ++, o programa não será iniciado, pois não será compilado, mas ecoará $? retornará 255. Mas era isso que se pretendia.O uso do c ++ oferece enormes oportunidades. Primeiro, a sintaxe familiar. Em segundo lugar, classes padrão como std :: vector, std :: map ou std :: string e outras são coisas insubstituíveis. A mesma linha - o que você quiser fazer com ela, procure na linha, divida-a em substrings, desconecte e conquiste, obtenha matrizes. E eu não preciso nem do sed nem do awk. Terceiro, o depurador - Deus! que benção! Eu tenho um depurador gdb para o script! Além disso, você pode usar o std :: filesystem (se o compilador permitir). Você pode continuar ...Infelizmente, muitas vezes acontece comigo que eu o farei primeiro e depois pensarei: "e se alguém já fez isso?" E, de fato, não sou o primeiro a ter a idéia de fazer o mesmo. Aqui está um exemplo: https://github.com/dimgel/cpp-linux-scripts a idéia é a mesma, a implementação é diferente. Acontece que existem outras implementações .Em geral, senti uma pequena decepção por minha própria não exclusividade. No entanto, procurei por Habr - não encontrei um semelhante. Talvez alguém pareça pelo menos curioso?