Сценарий оболочки для компиляции файлов C

CentOS 7 /Usr/Share/doc/initscripts-9.49.24/sysconfig.txt говорит:

  больше не поддерживается:
  PROMICK = Да | Нет (включить или отключить беспорядочный режим)
  Allmulti = Да | Нет (включить или отключить все-многоадресный режим)
 

Так что для включения вам необходимо запустить:

ip link set ethX promisc on

или если вы хотите произойти при загрузке, вы можете использовать Systemd Systemd RC-Local .
Поместите вышеуказанную линию в /etc/rc.d/rc.local (не забудьте изменить Ethx с вашим правильным устройством), затем:

chmod u+x /etc/rc.d/rc.local
systemctl enable rc-local
systemctl start rc-local
-2
21.06.2014, 16:31
3 ответа

Вам не нужно запускать команду ls *.c. Бэш автоматически расширит шаблон подстановочного знака. Так что если вы в полном отчаянии и не хотите делать Makefile, вы можете сделать это:

#!/usr/bin/env bash

for i in *.c
do
    echo "gcc -g3 -o3 $i -o ${i%.c}.out"
    # gcc -g3 -o3 "$i" -o "${i%.c}.out"
done

Пример

Скажем, у меня был этот образец данных:

$ ls -1
a.c
b.c
c.bash
c.c
d.c
e.c

Запуск моего скрипта c.bash:

$ ./c.bash 
gcc -g3 -o3 a.c -o a.out
gcc -g3 -o3 b.c -o b.out
gcc -g3 -o3 c.c -o c.out
gcc -g3 -o3 d.c -o d.out
gcc -g3 -o3 e.c -o e.out

Чтобы заставить скрипт работать, вы прокомментируете строку echo выше, и прокомментируете строку gcc.

6
28.01.2020, 05:14

Ваша петля for-loop for i в 'ls *.c' переплетается через буквальную строку "ls *.c", а не через выходную команду, как вы задумывали. Это можно исправить с помощью оператора подстановки команд (например, for i в $(ls *.c); do.... ), но, как указывает slm в своем ответе , в команде вообще нет необходимости, так как можно использовать вывод shell globbing в for-loop :)

Весь этот вопрос можно было бы также решить более корректно с помощью простого makefile:

CC = gcc
CFLAGS = -std=c99 -pedantic -D_XOPEN_SOURCE=600 -Wall -Werror -g
RM = rm -f
SRCS = $(wildcard *.c)
PROGS = $(patsubst %.c,%,$(SRCS))

.PHONY: all clean

all: $(PROGS)

%: %.c
    $(CC) $(CFLAGS) -g3 -o3 -o $@ $<

clean:
    $(RM) $(PROGS)

Запишите как "Makefile", запустите make. Удалите скомпилированные программы (чисто), запустив make clean. (Частично источник на Martin)

.
0
28.01.2020, 05:14

Глядя конкретно на ваш вопрос, кажется, что «где вы ошиблись» находится в расширении вашего параметра. Я думаю, вы пытались изменить значение i при именовании выходного файла здесь:

{$i%.} 

Мне кажется, вы неправильно поставили знак доллара. Возможно, вы имели в виду:

${i%.}

Хотя честно говоря, это только удалило бы «.» от исходного имени файла. Принимая во внимание, что «filename.c» дал бы «filenamec.out». Вы, наверное, хотите:

${i%.*}

Это дало бы «filename.out». Этот синтаксис расширения параметра преобразуется в нежадное удаление -всего, что начинается с «.» и после. Для жадного удаления синтаксис будет:

${i%%.*}

Я надеюсь, что это лучше ответит на ваш вопрос, поскольку он относится к вашему коду.

1
28.01.2020, 05:14

Теги

Похожие вопросы