LINUX.ORG.RU

История изменений

Исправление Moisha_Liberman, (текущая версия) :

  1. Ключ «интерпретировать как Си» всё-таки есть -xc

Есть, но я бы на него не сильно надеялся, т.к. семантика этого ключа говорит только о том, какой именно файл мы подсунули на вход – С, если -xc, asm – -xa или ещё что. В принципе, использовать можно, но идея не очень.

На мой взгляд, более «чистый» вариант всё таки настроить binfmt_misc.

  1. Этот ключ почему-то не работает в прямом шебанге

Я бы сказал что он и не должен, т.к. не для того делался.

  1. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла).

В принципе, он должен указываться до -run, а options как в указанном случае – tcc [options...] -run infile [arguments...].

Но вообще, если честно, то tcc это прежде всего компилятор, выполнение скриптухи это так… «приятный бонус».

Вопрос: А как отловить execve внутри скрипта? Хотел посмотреть, что там на самом деле ядро делает с шебангом - не могу поймать strace’ом как оно параметры передает на самом деле.

Just use strace -b execve ./4strace. В 4strace следующее содержимое, для простоты:

#!/usr/bin/tcc -run

#include <unistd.h>

int main(int argc, char **argv) {
	execve("./t.sh", NULL, NULL); /* And this */
	return(0);
}

Опция -b разве что и поддерживает только именно execve.

P.S. С -w всё просто – это отключение предупреждений. Плохая идея, да и не особо эта опция важна в нашем случае.

Исходная версия Moisha_Liberman, :

Эммм...

  1. Ключ «интерпретировать как Си» всё-таки есть -xc

Есть, но я бы на него не сильно надеялся, т.к. семантика этого ключа говорит только о том, какой именно файл мы подсунули на вход – С, если -xc, asm – -xa или ещё что. В принципе, использовать можно, но идея не очень.

На мой взгляд, более «чистый» вариант всё таки настроить binfmt_misc.

  1. Этот ключ почему-то не работает в прямом шебанге

Я бы сказал что он и не должен, т.к. не для того делался.

  1. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла).

В принципе, он должен указываться до -run, а options как в указанном случае – tcc [options...] -run infile [arguments...].

Но вообще, если честно, то tcc это прежде всего компилятор, выполнение скриптухи это так… «приятный бонус».

Вопрос: А как отловить execve внутри скрипта? Хотел посмотреть, что там на самом деле ядро делает с шебангом - не могу поймать strace’ом как оно параметры передает на самом деле.

Just use strace -b execve ./4strace. В 4strace следующее содержимое, для простоты:

#!/usr/bin/tcc -run

#include <unistd.h>

int main(int argc, char **argv) {
	execve("./t.sh", NULL, NULL); /* And this */
	return(0);
}

Опция -b разве что и поддерживает только именно execve.