История изменений
Исправление
Moisha_Liberman,
(текущая версия)
:
- Ключ «интерпретировать как Си» всё-таки есть
-xc
Есть, но я бы на него не сильно надеялся, т.к. семантика этого ключа говорит только о том, какой именно файл мы подсунули на вход – С, если -xc
, asm – -xa
или ещё что. В принципе, использовать можно, но идея не очень.
На мой взгляд, более «чистый» вариант всё таки настроить binfmt_misc.
- Этот ключ почему-то не работает в прямом шебанге
Я бы сказал что он и не должен, т.к. не для того делался.
- Мало того - в формате #!/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,
:
Эммм...
- Ключ «интерпретировать как Си» всё-таки есть
-xc
Есть, но я бы на него не сильно надеялся, т.к. семантика этого ключа говорит только о том, какой именно файл мы подсунули на вход – С, если -xc
, asm – -xa
или ещё что. В принципе, использовать можно, но идея не очень.
На мой взгляд, более «чистый» вариант всё таки настроить binfmt_misc.
- Этот ключ почему-то не работает в прямом шебанге
Я бы сказал что он и не должен, т.к. не для того делался.
- Мало того - в формате #!/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
.