Как я могу создать пользовательскую команду терминала с переменным аргументом?

Я уже читал Как мне создать собственную команду терминала (для запуска сценария)? . Но при этом всегда выполняется одна и та же команда.

Я хочу, например, вместо того, чтобы вводить

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 .

Как я могу это сделать? Спасибо

4
задан 18 November 2020 в 14:05

6 ответов

Общий ответ:
Откройте свой веб-браузер на 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

Теперь

  • откройте новый терминал (оболочку),
  • cd в папку, где у вас, например, "program.c" и введите
  • custom-gcc program

... с этого момента он должен выполнять ваш custom-gcc с желаемым эффектом.

ПРИМЕЧАНИЕ: bash руководств. за ссылкой выше предоставит всю информацию, необходимую для улучшения простого скрипта, созданного с помощью приведенных выше инструкций.

Объяснение:
cd гарантирует, что вы находитесь в $ HOME /

Следующие две строки создают подпапку bin / в вашем домашнем каталоге и делает ее местом для поиска «команд».

Строки от cat до EOF ] - это простой способ создания текстового файла, здесь содержимым текстового файла будет сценарий bash, который выполняет то, что вы запрашиваете (подсказка: прочтите руководства Bash, чтобы понять содержимое).

chmod устанавливает «флаги режима» для только что созданного файла, так что он будет считаться «исполняемым».

Самая последняя строка закрывает оболочку.

Поскольку вы с этого момента открываете новую оболочку (терминал), $ Переменная PATH будет иметь e ваша личная папка «$ HOME / bin /», в которой все файлы будут рассматриваться как возможные команды для выполнения - при вводе имени одного из них в приглашении оболочки.

5
ответ дан 3 January 2021 в 22:49

На самом деле, есть более мощный инструмент, который можно использовать для этой задачи компиляции - 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 учебник .

1
ответ дан 3 January 2021 в 22:49

Для этой конкретной задачи я бы использовал 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: переменные, используемые неявными правилами

10
ответ дан 3 January 2021 в 22:49

Ответ 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 в том, что они могут быть настолько сложными, насколько вы хотите их сделать (хотя скрипты лучше для всего длиннее нескольких команд).

0
ответ дан 3 January 2021 в 22:49

В общем, чтобы создать пользовательскую команду терминала с переменным аргументом, вы можете в своем сценарии использовать переменные «$ 1», «$ 2» и т. Д. Они возвращают первый и второй аргументы в командной строке. «$ 0» возвращает саму команду.

Так, например, следующий скрипт foo :

# / bin / bash эхо "$ 0" эхо "$ 1" echo "$ 2"

вернется, если вы вызовете его из командной строки

foo one two three
foo
one
two
three
2
ответ дан 3 January 2021 в 22:49

Быстро и грязно

просто создайте псевдоним , дайте ему классное имя.

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), если вы хотите запускать его от имени этих пользователей.

4
ответ дан 3 January 2021 в 22:49

Другие вопросы по тегам:

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