Blesk

shebang_exec.sh

Stáhnout

#!/bin/bash

# Vytvoří se soubor exec_dummy.c, který obsahuje kód, ve kterém
# se volá ‹execv› na program, který na začátku obsahuje „shebang“.
cat > exec_dummy.c <<EOF
#include <stddef.h>
#include <unistd.h>
int main()
{
    char *argv[] = { "foo", "a", "b", "c", NULL };
    execv( "./dummy", argv );
}
EOF

# Soubor s „shebangem“, který spouštíme. Vidíme, že má uvedenou
# cestu /tmp/runner, tam tedy před spuštěním musíme umístit
# interpret.
cat > dummy <<EOF
#!/tmp/runner
whatever
EOF

# Vytvoří se soubor runner.c, který obsahuje kód „interpretu“, který
# pouze vypíše své argumenty.
cat > runner.c <<EOF
#include <unistd.h>
#include <stddef.h>
#include <stdio.h>
int main( int argc, char **argv )
{
    for ( int i = 0; i < argc; ++i )
        printf( "argv[ %d ] → %s\n", i, argv[ i ] );
}
EOF

# Překlad oněch dvou kódů v C.
c99 -o runner runner.c
c99 -o exec_dummy exec_dummy.c

# Pokud chceme spouštět soubor dummy, musí k tomu mít nastavený bit.
chmod +x dummy

# Umístíme přeložený interpret na očekávané místo.
cp runner /tmp/

# Samotné spuštění celé věci. Jak vidíme, interpretu není mezi
# argumenty předán řetězec "foo".
./exec_dummy

rm /tmp/runner