Как запустить псевдоним в сценарии оболочки?

У меня есть исполняемый файл 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 чтобы это произошло?

Некоторые варианты:

  1. В вашем сценарии оболочки используйте полный путь, а не псевдоним.

  2. В вашем сценарии оболочки задайте переменную с другим синтаксисом

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'$petsc myexecutable
  3. Используйте функцию в своем скрипте. Вероятно, лучше, если petsc является сложным

    function petsc () {    command 1    command 2}petsc myexecutable
  4. Источник ваших псевдонимов

    shopt -s expand_aliasessource /home/your_user/.bashrc

Вы, вероятно, не хотите, чтобы источник вашего .bashrc, так что, ИМО, один из первых 3 был бы лучше.

Псевдонимы устарели в пользу функций оболочки. Из страница руководства по bash:

Почти для всех целей псевдонимы заменяются функциями оболочки.

Чтобы создать функцию и экспортировать ее в подоболочки, введите в свой ~/.bashrc:

petsc() {    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"}export -f petsc

Затем вы можете свободно вызывать свою команду из своих сценариев оболочки.

В bash 4 вы можете использовать специальную переменную: $BASH_ALIASES.

Например:

$ alias foo="echo test"$ echo ${BASH_ALIASES[foo]}echo test$ echo `${BASH_ALIASES[foo]}` bartest 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`" \;
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/bashshopt -s expand_aliasesalias foo=barfoo whatever

Что касается почему? Я бы хотел сделать это: из-за необычных обстоятельств мне нужно обмануть Dockerfile, заставив его думать, что это сценарий оболочки.

Функции и псевдонимы оболочки ограничены оболочкой и не работают в выполняемых сценариях оболочки. Альтернативы для вашего случая:

  • (если вы не потрудитесь использовать 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/shexec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
    • если программа позволяет это, вы можете пропустить shellscript и создать символическую ссылку с помощью команды:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc

Вы можете заставить bash выполнить ваш скрипт как интерактивную оболочку с флагом -i. Это скажет вашему файл .bashrc для определения псевдонимов и других функций.

Пример:

~ $ grep ll .bashrcalias ll='ls -lah'~ $ cat script.sh #!/bin/shll~ $ bash script.sh script.sh: line 3: ll: command not found~ $ bash -i script.sh..directory contents..

Дополнительная информация:

$ man bash
  1. В .bash_aliases:

    petsc {~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"}

    Или поместите функцию в .bashrc. Обычно в .bashrc только настройки конфигурации bash хранятся.

  2. В Терминале: source .bash_aliases

  3. Назови это: petsc arg(s)

Преимущество: вам не нужно export -f petscв .bash_aliases. Псевдонимы устарели, но с использованием .bash_aliases для функций все в порядке.

  1. Используйте свои псевдонимы в вашем сценарии оболочки.
  2. Создайте свой сценарий в вашей текущей интерактивной оболочке вместо того, чтобы выполнять его.

Итак, если у вас есть файл с именем script.sh с помощью ваших команд, которые включают использование псевдонимов, просто введите:

source script.sh

(РЕДАКТИРОВАТЬ: удалены функции, так как я неправильно истолковал вызов mpiexec.)

Если единственное, что вам нужно, - это меньше печатать, почему бы вам просто не поместить папку в $PATH? Или сделать символическую ссылку на mpiexec из какой-нибудь папки в $PATH? Или (мой любимый) поместить псевдоним в сценарий, который вы создаете в вызывающем скрипте?

Пожалуйста, используйте #!/usr/bin/env sh вместо #!/usr/bin/env bash, тогда это сработает.

sample:my.sh

#!/usr/bin/env shalias k="kubectl --kubeconfig ~/shop/config"k version
./my.sh

Если вам нужно использовать #!/usr/bin/env bash, затем выполните сценарий следующим образом:

sh my.sh

На самом деле я просто использовал системную ссылку, которая работала для меня так: ln -sf /usr /bin /podman .local /bin /docker

Связанные: alias - Why doesn't my Bash script recognize aliases? - Unix & Linux Stack Exchange

Как насчет добавления псевдонима в .bash_aliases? Также как насчет псевдонимирования абсолютного пути вместо относительного пути, например `alias petsc=’/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec"

@nitstorm: Похоже, ни одно из решений не работает… Я все еще получаю ту же ошибку, что и раньше