На этот вопрос уже есть ответ здесь:
У меня есть несколько удаленных машин, где мне нужно скомпилировать исходный код. Обычно я пишу псевдоним, который говорит что-то вроде:
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 ++. Есть ли способ написать псевдоним, который будет принимать аргумент? что мне делать?
Затем, когда я иду для компиляции удаленно
, Это - основная проблема. Псевдонимы, определенные в локальном файле конфигурации или локальной интерактивной оболочке, не будут работать над удаленной системой. Определите псевдоним в своей удаленной машине ~/.bashrc
, и это будет работать затем.
А лучший подход должен был бы определить функцию как предложенный Eliah. Но необходимо было бы все еще определить его на удаленной машине, как с псевдонимом.
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 предположил.