У меня есть исполняемый файл mpiexec
, полный путь которого ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Поскольку я хочу выполнить эту команду в разных каталогах (без повторного ввода всего пути), я устанавливаю псевдоним в моем домашнем файле .bashrc
:
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
, который позволяет мне выполнить это mpiexec
в командной строке легко, набрав:
petsc myexecutable
Я попытался написать файл сценария оболочки с именем script
, используя мой новый псевдоним petsc
в качестве команды. После того, как я дал сценарию оболочки соответствующие разрешения (используя chmod
), я попытался запустить скрипт. Однако это дало мне следующую ошибку:
./script: line 1: petsc: command not found
Я знаю, что могу просто написать полный путь к файлу mpiexec
, но громоздко писать полный путь каждый раз, когда я хочу напишите новый скрипт. Есть ли способ, которым я могу использовать свой псевдоним petsc
внутри файла сценария? Есть ли способ редактировать мои .bashrc
или .bash_profile
, чтобы это произошло?
petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
$petsc myexecutable
Используйте функцию в вашем скрипте. Вероятно, лучше, если petsc сложный function petsc () {
command 1
command 2
}
petsc myexecutable
Источник ваших псевдонимов shopt -s expand_aliases
source /home/your_user/.bashrc
Вероятно, вы не хотите, чтобы источник .bashrc, поэтому IMO, один из первых 3 был бы лучше. [ ! d9]
Псевдонимы устаревают в пользу функций оболочки. На странице руководства bash:
For almost every purpose, aliases are superseded by shell functions.
Чтобы создать функцию и экспортировать ее в подоболочки, поместите следующее в свой ~/.bashrc:
[ f2]Затем вы можете свободно вызывать свою команду из своих скриптов.
Функции и псевдонимы оболочки ограничены оболочкой и не работают в исполняемых сценариях оболочки. Альтернативы для вашего случая:
(если вы не хотите использовать mpiexec вместо petsc) Добавьте $HOME/petsc-3.2-p6/petsc-arch/bin в свою переменную PATH. Это можно сделать, отредактировав ~/.profile и добавив:PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"
Повторный вход для применения этих изменений. Создайте каталог ~/bin и создайте сценарий оболочки с именем petsc, содержащий: #!/bin/sh
exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
, если программа разрешает это, вы может пропустить shellscript и сделать символическую ссылку с помощью команды: ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
В bash 4 вы можете использовать специальную переменную: $BASH_ALIASES.
Например:
$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo `${BASH_ALIASES[foo]}` bar
test bar
Альтернативно определить как переменную, тогда используйте команду подстановка или eval.
Так, например, вместо определения псевдонима, такого как:
alias foo="echo test"
, определите его как:
foo="echo test"
вместо , Затем выполните его:
find . -type f -exec sh -c "eval $foo" \;
или:
find . -type f -exec sh -c "echo `$foo`" \;
Вы можете поместить следующий код в свой .bash_aliases:
petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
Затем вы должны source .bash_aliases сохранить файл. Затем вызывается: petsc arg.
Преимущество: вам не нужно export -f petsc в bash_aliases. Алиасы устарели, но я полагаю, что просто использовать .bash_aliases нет.
Итак, если у вас есть файл с именем script.sh с вашими командами, которые включают использование псевдонимов, просто введите:
source script.sh
Вы можете заставить bash выполнить ваш скрипт как интерактивную оболочку с флагом -i. Это будет указывать ваш файл .bashrc для определения псевдонимов и других функций.
Пример:
~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh
#!/bin/sh
ll
~ $ bash script.sh
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..
Дополнительная информация:
$ man bash
(EDIT: удаленные функции, так как я неправильно читаю вызов mpiexec.)
Если единственное, что вам нужно - это не печатать, почему бы вам просто не поместить папку в $ PATH? Или сделать символическую ссылку на mpiexec из какой-либо папки в $ PATH? Или (мой любимый) помещает псевдоним в скрипт, который вы используете в вызывающем скрипте?
Итак, если у вас есть файл с именем script.sh
с вашими командами, которые включают использование псевдонимов, просто введите:
source script.sh
(EDIT: удаленные функции, так как я неправильно читаю вызов mpiexec.)
Если единственное, что вам нужно, - это не печатать, почему бы вам просто не поместить папку в $ PATH? Или сделать символическую ссылку на mpiexec из какой-либо папки в $ PATH? Или (мой любимый) помещает псевдоним в сценарий, который вы используете в вызывающем скрипте?
ALIASES
...
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
below).
Таким образом, реальный ответ на этот вопрос для тех, кто хочет использовать реальные псевдонимы в сценариях оболочки вместо альтернатив им, это:
#!/bin/bash
shopt -s expand_aliases
alias foo=bar
foo whatever
Что касается , почему Я бы хотел сделать это: из-за необычных обстоятельств мне нужно обмануть Dockerfile, подумав, что это сценарий оболочки.