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

65

У меня есть исполняемый файл mpiexec , полный путь которого равен ~/petsc-3.2-p6/petsc-arch/bin/mpiexec . Поскольку я хочу выполнить эту команду в разных каталогах (без повторного ввода всего пути), я устанавливаю псевдоним в своем home .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 , чтобы это произошло?

    
задан Paul 26.01.2012 в 19:11
источник

8 ответов

52
  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_aliases
    source /home/your_user/.bashrc
    

Вероятно, вы не хотите, чтобы источник .bashrc , поэтому IMO, один из первых 3 был бы лучше.

    
ответ дан Panther 26.01.2012 в 19:19
источник
46

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

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

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

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}
export -f petsc

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

    
ответ дан enzotib 26.01.2012 в 19:28
10

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

  • (если вы не хотите использовать 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 "[email protected]"
      
    • , если программа позволяет это, вы можете пропустить shellscript и сделать символическую ссылку с помощью команды:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      
ответ дан Lekensteyn 26.01.2012 в 19:52
4

В 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'" \;
    
ответ дан kenorb 02.06.2015 в 00:31
2

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

petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}

Затем вам нужно source .bash_aliases файла. Затем назовите его: petsc arg .

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

    
ответ дан Timo 28.03.2015 в 10:07
1
  1. Используйте свои псевдонимы в сценарии оболочки.
  2. Отправьте свой сценарий в свою текущую интерактивную оболочку, а не выполняйте ее.

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

source script.sh
    
ответ дан Gordon Erlebacher 25.07.2016 в 02:00
1

Вы можете заставить 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
    
ответ дан Amado Martinez 10.01.2017 в 09:03
0

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

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

    
ответ дан unhammer 26.01.2012 в 20:22