Я уже читал Как мне создать собственную команду терминала (для запуска сценария)? . Но при этом всегда выполняется одна и та же команда.
Я хочу, например, вместо того, чтобы вводить
gcc -m32 -g -zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 -no-pie -fno-pic -o program program.c
, мне просто нужно было бы ввести специальную команду, например
custom-gcc program
или, по крайней мере,
custom-gcc -o program program.c
. было бы хорошо, если бы я мог добавить параметры к пользовательской команде, которая также была бы добавлена в gcc
.
Как я могу это сделать? Спасибо
Общий ответ:
Откройте свой веб-браузер на www.tldp.org и найдите «Руководства по Bash»
Простой ответ:
Открыть терминал (оболочка) и введите (в процессе вы увидите текст, не показанный здесь)
cd mkdir bin echo >>.bash_aliases 'PATH=$PATH:$HOME/bin' cat <<EOF >bin/custom-gcc #!/bin/bash gcc -m32 -g -zexecstack -fno-stack-protector \ -mpreferred-stack-boundary=2 -no-pie -fno-pic \ -o "$1" "$1.c" EOF chmod 755 bin/custom-gcc exit
Теперь
custom-gcc program
... с этого момента он должен выполнять ваш custom-gcc
с желаемым эффектом.
ПРИМЕЧАНИЕ: bash руководств. за ссылкой выше предоставит всю информацию, необходимую для улучшения простого скрипта, созданного с помощью приведенных выше инструкций.
Объяснение:
cd
гарантирует, что вы находитесь в $ HOME /
Следующие две строки создают подпапку bin /
в вашем домашнем каталоге и делает ее местом для поиска «команд».
Строки от cat
до EOF
] - это простой способ создания текстового файла, здесь содержимым текстового файла будет сценарий bash, который выполняет то, что вы запрашиваете (подсказка: прочтите руководства Bash, чтобы понять содержимое).
chmod
устанавливает «флаги режима» для только что созданного файла, так что он будет считаться «исполняемым».
Самая последняя строка закрывает оболочку.
Поскольку вы с этого момента открываете новую оболочку (терминал), $ Переменная PATH будет иметь e ваша личная папка «$ HOME / bin /», в которой все файлы будут рассматриваться как возможные команды для выполнения - при вводе имени одного из них в приглашении оболочки.
На самом деле, есть более мощный инструмент, который можно использовать для этой задачи компиляции - Makefile, для некоторого руководства, пожалуйста, обратитесь к этой ссылке .
И если вам действительно нужен простой сценарий bash, попробуйте сценарий, например: compile.sh вот так:
gcc -m32 -g -zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 -no-pie -fno-pic -o "$1" "$1.c"
$ ./compile.sh программа или какой-нибудь сценарий bash учебник .
Для этой конкретной задачи я бы использовал make
Создайте Makefile
в исходном каталоге со следующим содержанием:
$ cat Makefile
CC := gcc
CFLAGS := \
-m32 -g \
-zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 \
-fno-pic
LDFLAGS := -no-pie
Затем вы можете просто запустить make программу
, чтобы скомпилировать и связать свой код с заданными параметрами ex. задано
==> hello.c <==
#include <stdio.h>
int main(void) { printf("Hello, world!\n") ; return 0; }
==> goodbye.c <==
#include <stdio.h>
int main(void) { printf("Goodbye, world!\n") ; return 0; }
, затем
$ make hello
gcc -m32 -g -zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 -fno-pic -no-pie hello.c -o hello
и
$ make goodbye
gcc -m32 -g -zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 -fno-pic -no-pie goodbye.c -o goodbye
Для справки см. GNU make: переменные, используемые неявными правилами
Ответ Steeldriver подходит для конкретной ситуации в вашем вопросе, как и псевдонимы (если переменные данные находятся в конце строки!), Но вы можете также напишите функцию bash:
custom-gcc()
{
gcc -m32 -g \
-zexecstack -fno-stack-protector \
-mpreferred-stack-boundary=2 -no-pie
-fno-pic -o ${1} ${1).c
}
Добавьте ее в конец вашего ~ / .bashrc
, затем «выполните исходный код», запустив . ~ / .bashrc
(обратите внимание на ведущий .
). Загрузите его в каждое открытое окно терминала. В новых окнах это будет происходить автоматически.
Теперь, имея файл program.c, вы можете запустить:
custom-gcc program
Прелесть функций bash в том, что они могут быть настолько сложными, насколько вы хотите их сделать (хотя скрипты лучше для всего длиннее нескольких команд).
В общем, чтобы создать пользовательскую команду терминала с переменным аргументом, вы можете в своем сценарии использовать переменные «$ 1», «$ 2» и т. Д. Они возвращают первый и второй аргументы в командной строке. «$ 0» возвращает саму команду.
Так, например, следующий скрипт foo
:
# / bin / bash эхо "$ 0" эхо "$ 1" echo "$ 2"
вернется, если вы вызовете его из командной строки
foo one two three
foo
one
two
three
Быстро и грязно
просто создайте псевдоним , дайте ему классное имя.
echo "alias gargamel='gcc -m32 -g -zexecstack -fno-stack-protector -mpreferred-stack-boundary=2 -no-pie -fno-pic -o'" >> /home/yourusername/.bashrc
source /home/yourusername/.bashrc
Выполните его:
gargamel program program.c
Это работает только для пользователя, для которого вы создали псевдоним. Поэтому вам нужно будет создать псевдоним для других пользователей (включая root), если вы хотите запускать его от имени этих пользователей.