LINUX.ORG.RU

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

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

Отдохнул.

То что он задумал

Вообще ничего умного и хитрого не задумывал. Тупо хочу *.c.sh заставить работать с tcc через шебанг.

И таки заставил. Волшебный шебанг: #!/usr/bin/env -S /usr/bin/tcc -run -xc -w

Там что-то удивительное и мне не понятное...

$ F1=tcc_test.abc;echo -e '#!/usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
./tcc_test.abc: error: unrecognized file type
не работает.

но в то же время:

$ F1=tcc_test.abc;echo -e '#!/usr/bin/env -S /usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
filename [tcc_test.abc] yes
работает!

Т.е.:
1. Ключ «интерпретировать как Си» всё-таки есть -xc
2. Этот ключ почему-то не работает в прямом шебанге
3. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла).
4. Но ведь -w работает же! Хоть так, хоть эдак. Кажется наврал. И кажется вообще понял что происходит.

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

Исправление Toxo2, :

Отдохнул.

То что он задумал

Вообще ничего умного и хитрого не задумывал. Тупо хочу *.c.sh заставить работать с tcc через шебанг.

И таки заставил. Волшебный шебанг: #!/usr/bin/env -S /usr/bin/tcc -run -xc -w

Там что-то удивительное и мне не понятное...

$ F1=tcc_test.abc;echo -e '#!/usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
./tcc_test.abc: error: unrecognized file type
не работает.

но в то же время:

$ F1=tcc_test.abc;echo -e '#!/usr/bin/env -S /usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
filename [tcc_test.abc] yes
работает!

Т.е.:
1. Ключ «интерпретировать как Си» всё-таки есть -xc
2. Этот ключ почему-то не работает в прямом шебанге
3. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла).
4. Но ведь -w работает же! Хоть так, хоть эдак.

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

Исправление Toxo2, :

Отдохнул.

То что он задумал

Вообще ничего умного и хитрого не задумывал. Тупо хочу *.c.sh заставить работать с tcc через шебанг.

И таки заставил. Волшебный шебанг: #!/usr/bin/env -S /usr/bin/tcc -run -xc -w

Там что-то удивительное и мне не понятное...

$ F1=tcc_test.abc;echo -e '#!/usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
./tcc_test.abc: error: unrecognized file type
не работает.

но в то же время:

$ F1=tcc_test.abc;echo -e '#!/usr/bin/env -S /usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
filename [tcc_test.abc] yes
работает!

Т.е.:
1. Ключ «интерпретировать как Си» всё-таки есть -xc
2. Этот ключ почему-то не работает в прямом шебанге
3. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла). 4. Но ведь -w работает же! Хоть так, хоть эдак.

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

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

Отдохнул.

То что он задумал

Вообще ничего умного и хитрого не задумывал. Тупо хочу *.c.sh заставить работать с tcc через шебанг.

И таки заставил. Волшебный шебанг: #!/usr/bin/env -S /usr/bin/tcc -run -xc -w

Там что-то удивительное и мне не понятное...

$ F1=tcc_test.abc;echo -e '#!/usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
./tcc_test.abc: error: unrecognized file type
не работает.

но в то же время:

$ F1=tcc_test.abc;echo -e '#!/usr/bin/env -S /usr/bin/tcc -run -xc -w\nmain() {printf("filename ['$F1'] yes\\n");}' > $F1; chmod +x ./$F1; ./$F1; rm ./$F1
filename [tcc_test.abc] yes
работает!

Т.е.:
1. Ключ «интерпретировать как Си» всё-таки есть -xc
2. Этот ключ почему-то не работает в прямом шебанге
3. Мало того - в формате #!/usr/bin/tcc он ведёт себя по-разному в зависимости от места: до -run или после -run: или компилируется, но не выполняется; или выполняется, но без явно указанного типа (и поэтому определяет тип по расширению файла).

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