Могу ли я написать псевдоним, который принимает аргумент? [дубликат]

На этот вопрос уже есть ответ здесь:

У меня есть несколько удаленных машин, где мне нужно скомпилировать исходный код. Обычно я пишу псевдоним, который говорит что-то вроде:

alias g++='g++ `pkg-config --cflags opencv --libs opencv`'

Затем, когда я перехожу к удаленной компиляции, я выполняю g ++ -o test test .cpp .

По какой-то причине Ubuntu не позволяет мне этого делать. Вместо этого Ubuntu работает, когда я это делаю:

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

Но это означает, что я не могу написать псевдоним для g ++. Есть ли способ написать псевдоним, который будет принимать аргумент? что мне делать?

5
задан 27 January 2017 в 11:08

2 ответа

Затем, когда я иду для компиляции удаленно

, Это - основная проблема. Псевдонимы, определенные в локальном файле конфигурации или локальной интерактивной оболочке, не будут работать над удаленной системой. Определите псевдоним в своей удаленной машине ~/.bashrc, и это будет работать затем.

А лучший подход должен был бы определить функцию как предложенный Eliah. Но необходимо было бы все еще определить его на удаленной машине, как с псевдонимом.

2
ответ дан 23 November 2019 в 09:12

TL; DR: использовать command g++ в оболочке функционируют вместо g++ в псевдониме.

Как 6.6 Псевдонимов в справочнике Bash говорит:

Нет никакого механизма для использования аргументов в тексте замены, как в csh. Если аргументы необходимы, функция оболочки должна использоваться (см. Функции Shell).

Хотя псевдоним расширится, даже когда это появляется перед дополнительным текстом, псевдонимы самостоятельно не поддерживают позиционные параметры (т.е. параметры командной строки), таким образом, Вы не можете использовать псевдоним для выполнения существующей задачи. Таким образом, Вы не можете использовать псевдоним для выполнения команды с указанными пользователями аргументами, сопровождаемыми дополнительными аргументами.

Поскольку Вы нашли, можно использовать псевдоним для создания g++ file.cpp -o file выполненный:

g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file

Но не сделать g++ file.cpp -o file выполните эту команду:

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

Так, если Вы захотите это, то Вы, вероятно, захотите использовать функцию оболочки:

g++ () {
    command g++ `pkg-config --cflags opencv --libs opencv` "$@"
}

Вы можете:

  • Выполненный, что на командной строке, и это будет определено, пока текущая оболочка работает в том экземпляре оболочки только, или
  • добавьте его к Вашему ~/.bashrc файл, и запускает новую оболочку или работает . ~/.bashrc.

Это определяет вызванную функцию g++. С тех пор, в отличие от псевдонимов, функции могут назвать себя, я использовал command встроенный для предотвращения нежелательной рекурсии. command g++ называет внешнее g++ команда. "$@" расширяется до всех параметров командной строки, переданных функции.

В очень редком случае это g++ действительно должен был быть псевдоним, Вы могли "обмануть" и определить его как псевдоним к функции (так же, как можно определить псевдоним к любой другой команде). Вы могли сделать это или путем определения функции сначала или путем определения его каждый раз в псевдониме (как George предполагает). Однако нет никакой потребности в Вас сделать это; функция будет хорошо работать.

Конечно, Вы не могли бы всегда хотеть g++ иметь вывод pkg-config --cflags opencv --libs opencv переданный ему. Таким образом, Вы могли бы хотеть поместить определение псевдонима в файл и получить его только, когда Вы хотите его. Если Ваше определение находится в g++-fn.sh в Вашем корневом каталоге затем для включения функции можно работать:

. ~/g++-fn.sh

И отключить функцию (неважно, как это было определено), можно работать:

unset -f g++

Я должен добавить, что для чего-либо кроме крошечных или в других отношениях тривиальных программ необходимо, по крайней мере, рассмотреть использование make (вместо вызова g++ самостоятельно с выводом pkg-config каждый раз), как steeldriver предположил.

4
ответ дан 23 November 2019 в 09:12

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

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