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

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

77
задан 27 January 2012 в 00:41

11 ответов

В сценарии оболочки используйте полный путь, а не псевдоним. В сценарии оболочки установите переменную, другой синтаксис
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]

53
ответ дан 25 May 2018 в 14:50
  • 1
    Пункт 4 не работает, если вы не используете shopt -s expand_aliases в том же скрипте. – enzotib 27 January 2012 в 00:29
  • 2
    Ваше предложение 2) работает, но я хочу иметь возможность использовать одну и ту же команду в нескольких сценариях оболочки без необходимости писать первую строку petsc = " ... & quot ;. Есть ли способ сделать это? – Paul 27 January 2012 в 00:31
  • 3
    Звучит так, как будто вы должны поставить команду в более стандартное расположение, например /usr/local/bin – Panther 27 January 2012 в 00:35
  • 4
    @enzotib - спасибо, я добавил это к моему ответу. – Panther 27 January 2012 в 00:36
  • 5
    В пункте 2 вы не устанавливаете псевдоним, а переменную. – pabouk 1 November 2014 в 13:58

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

For almost every purpose, aliases are superseded by shell functions.

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

[ f2]

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

47
ответ дан 25 May 2018 в 14:50
  • 1
    Это почти работает ... единственная проблема заключается в том, что мне нужно иметь возможность передавать разные флаги исполняемому «mpiexec» ... Например, мне нужно иметь возможность выполнять что-то вроде «petsc -n 40 myexecutable», с псевдонимом "petsc" – Paul 27 January 2012 в 00:46
  • 2
    @Paul: Я добавил "$@" только для обработки аргументов. – enzotib 27 January 2012 в 01:47

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

(если вы не хотите использовать 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
10
ответ дан 25 May 2018 в 14:50

В 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`" \;
4
ответ дан 25 May 2018 в 14:50
  • 1
    Привычные псевдонимы устарели в пользу функций оболочки, этот ответ - единственный, который должен быть принят. Даже старый Debian 8 имеет версию 4 bash, поэтому ${BASH_ALIASES[alias]} - хороший вариант. В противном случае мне пришлось отредактировать много строк моего .bash_aliases, чтобы применить другие вещи. Спасибо. – erm3nda 16 September 2017 в 12:23

Вы можете поместить следующий код в свой .bash_aliases:

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

Затем вы должны source .bash_aliases сохранить файл. Затем вызывается: petsc arg.

Преимущество: вам не нужно export -f petsc в bash_aliases. Алиасы устарели, но я полагаю, что просто использовать .bash_aliases нет.

2
ответ дан 25 May 2018 в 14:50
  • 1
    Мне нравится это решение, я попробую его позже – Greenonline 24 April 2015 в 05:24
Используйте свои псевдонимы в сценарии оболочки. Отправьте свой сценарий в свою текущую интерактивную оболочку, а не выполняйте ее.

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

source script.sh
1
ответ дан 25 May 2018 в 14:50
  • 1
    @DavidFoerster Этот метод отлично работает. Поиск сценария с помощью . или source buiiltin заставляет оболочку current выполнять все команды в ней. Если расширение alias произойдет в оболочке, в которой выполняются . или source, это происходит. Однако важно понимать, что этот метод иногда полезен, потому что часто требуется или хочет выполнить скрипт в своей оболочке с собственной средой. Сценарии оболочки, написанные с целью их выполнения обычным способом, обычно не следует использовать вместо них - они часто не будут работать правильно. – Eliah Kagan 10 January 2017 в 13:44
  • 2
    @EliahKagan: Спасибо. Теперь я понимаю, что должен подразумевать ответ. Я добавлю объяснение. – David Foerster 10 January 2017 в 13:52

Вы можете заставить 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
1
ответ дан 25 May 2018 в 14:50
  • 1
    .bashrc также читается во время выполнения неинтерактивной SSH-команды (поэтому у нее есть проверка на интерактивность вверху) – muru 10 January 2017 в 17:12
  • 2
    Я отредактировал свой ответ. Спасибо @muru – Amado Martinez 11 January 2017 в 03:10

(EDIT: удаленные функции, так как я неправильно читаю вызов mpiexec.)

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

0
ответ дан 25 May 2018 в 14:50
  • 1
    Причина, по которой я не могу поместить ее в мой $ PATH, состоит в том, что у меня есть другой файл mpiexec в другом каталоге, который alredy в моей $ PATH. Если я добавлю путь к этому новому «mpiexec», он, вероятно, попытается выполнить оба из них ... не так ли? – Paul 27 January 2012 в 01:34
  • 2
    Не могу понять, почему бы просто не использовать "$@". – enzotib 27 January 2012 в 01:49
  • 3
    Пол, он попытается выполнить тот, который первый в PATH, а не оба. – unhammer 27 January 2012 в 15:41
  • 4
    enzotib, а я неправильно понял, как был вызван mpiexec, я думал, что для этого нужны все аргументы. Изменит мой ответ :) – unhammer 27 January 2012 в 15:44
  1. Используйте свои псевдонимы в сценарии оболочки.
  2. Отправьте свой сценарий в свою текущую интерактивную оболочку, а не выполняйте ее.

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

source script.sh
1
ответ дан 31 July 2018 в 11:29

(EDIT: удаленные функции, так как я неправильно читаю вызов mpiexec.)

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

0
ответ дан 6 August 2018 в 02:16
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, подумав, что это сценарий оболочки.

0
ответ дан 10 August 2018 в 08:15

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

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