Bisakah saya menulis skrip dalam C ++?


Baru-baru ini saya harus terjun lagi / lagi ke dunia pemrograman skrip Linux yang indah. Pada prinsipnya, masalahnya tidak terlalu rumit, tetapi karena saya tidak sering menemukan tugas seperti itu, saya mempelajarinya lagi setiap waktu. Saya tahu pasti bahwa besok saya akan lupa banyak dan dalam sebulan saya akan google lagi bagaimana melakukan ini atau itu. Masalahnya ternyata masih sering Anda tidak menulis skrip lagi, tetapi Anda memodifikasi yang sudah ada yang ditulis oleh seseorang. Dan itu mungkin bukan bash, tetapi sh atau sesuatu yang lain ... Ada perbedaan dalam sintaksnya, apa yang bekerja di sh harus bekerja di bash, tetapi tidak selalu sebaliknya. Dan jika ada tanda hubung atau abu? Saya tidak tahu ... Masih ada perbedaan dalam bahasa skrip ini, dan mereka membingungkan. Dan tentu saja, bagi saya pribadi, ceri pada kue adalah ketika skrip memanggil beberapa sed atau awk dan ada parameter seperti pada baris perintah yang Anda lihat dan heran.Jelas bahwa ini semua tergantung pada kualifikasi programmer, tetapi tidak semuanya cocok di kepala saya. Dan sekarang kesabaran saya hilang dan saya berpikir bahwa mulai sekarang saya ingin mencoba menulis skrip dalam c ++ ...

Saya mengerti bahwa untuk administrator sistem yang sebenarnya, pemikiran saya mungkin tampak ambisius. Namun mengapa tidak?

Jadi idenya sangat sederhana. Saya ingin menulis skrip c ++ dengan cara yang sama seperti skrip biasa ditulis, yaitu, baris pertama skrip harus berisi shebang dan indikasi path ke "interpreter":

#!/bin/c++

Baris-baris selanjutnya dari skrip hanya akan menjadi program c ++ reguler.

Saya harus menyiapkan "juru bahasa" dari skrip c ++. Anda dapat menulisnya pada apa saja, setidaknya pada bash (ini adalah yang terakhir, meskipun tidak persis) Tentu saja, itu tidak akan menjadi juru bahasa, tetapi seorang penyusun.

Itu yang saya lakukan:

#!/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"

Script ini melakukan semua yang Anda butuhkan. Sebagai folder sementara, saya memilih folder ~ / .cache / c ++. Script asli akan disalin ke folder ini, tetapi tanpa baris pertama dengan shebang. Ini dilakukan oleh perintah ekor. Nama file baru akan seperti skrip asli, tetapi dengan ekstensi c ++. Biner dengan ekstensi .bin akan dikumpulkan di folder yang sama. Tapi pertama-tama, tentu saja, pemeriksaan "jika tes" dilakukan pada saat biner dibuat. Kompilasi hanya terjadi jika biner yang ada sudah usang dalam waktu sehubungan dengan "skrip" asli. Biner diluncurkan dengan perintah eval dan semua parameter awal diteruskan ke sana.

File c ++ ini perlu disalin ke folder / bin dan membuatnya dapat dieksekusi (chmod a + x).

Saya akan mencoba menulis "sk ++ c" pertama saya:

#!/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;
}

Program ini hanya mencetak daftar parameter input dan mengembalikan nomor mereka + 60. Saya
menjalankan "skrip":



Berhasil !!!

Jika Anda membuat kesalahan dalam kode c ++, program tidak akan memulai, karena tidak akan dikompilasi, tetapi echo $? akan mengembalikan 255. Tapi itulah yang dimaksudkan.

Menggunakan c ++ memberikan peluang luar biasa. Pertama, sintaksis yang sudah dikenal. Kedua, kelas standar seperti std :: vector, std :: map atau std :: string dan lainnya adalah hal-hal yang tidak tergantikan. Baris yang sama - apa pun yang ingin Anda lakukan dengannya, lihat di baris itu, pisahkan menjadi substring, lepaskan dan taklukkan, dapatkan array. Dan saya tidak perlu sed atau awk. Ketiga, debugger - God! sungguh suatu berkat! Saya memiliki debugger gdb untuk skrip! Selanjutnya, Anda dapat menggunakan std :: filesystem (jika kompiler memungkinkan). Anda bisa terus ...

Sayangnya, sering terjadi pada saya bahwa saya akan melakukannya terlebih dahulu, dan kemudian saya akan berpikir: "bagaimana jika seseorang telah melakukan ini?" Dan faktanya, saya bukan orang pertama yang memiliki ide untuk melakukan hal yang sama. Berikut ini sebuah contoh: https://github.com/dimgel/cpp-linux-scripts idenya sama, implementasinya berbeda. Kemudian ternyata ada implementasi lain .

Secara umum, saya mengalami sedikit kekecewaan terhadap non-eksklusivitas saya sendiri. Namun, saya mencari Habr - saya tidak menemukan yang serupa. Mungkin seseorang tampaknya setidaknya penasaran?

All Articles