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

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

137
задан 26 January 2012 в 22:41

10 ответов

E puer Optiounen:

  1. An Ärem Shell-Skript benotzt de komplette Wee anstatt en Alias.

  2. An Ärem Shell-Skript, setzt eng verännerlech, aner Syntax

     petsc  = '/ home / your_user / petsc-3.2-p6 / petsc-arch / bin / mpiexec'
    
     $ petsc myexecutable
     
  3. Benotzt eng Funktioun an Ärem Skript. Wahrscheinlech besser wann petsc komplex ass

     Funktioun petsc () {
      Kommando 1
      Kommando 2
     }
    
    petsc myexecutable
     
  4. Source Är Aliasen

     shopt -s expand_aliases
    Quell /home/your_user/.bashrc
     

Dir wëllt wahrscheinlech net Ären .bashrc Quell, sou datt den IMO ee vun den éischten 3 besser wier.

96
ответ дан 26 January 2012 в 22:41

Aliasen ginn entfouert zugonschte vu Shellfunktiounen. Vun der bash manueller Säit :

Fir bal all Zweck ginn Aliasen duerch Shellfunktiounen ersat.

Fir eng Funktioun ze kreéieren an ze exportéieren an Ënnerschuelen, setzt déi folgend an Ärem ~ / .bashrc :

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

Da kënnt Dir Äert Kommando fräi uruffen aus Äre Shell-Skripter.

80
ответ дан 26 January 2012 в 22:41

(EDIT: geläscht Funktiounen well ech ruffe vu mpiexec falsch gelies hunn.)

Wann dat eenzegt wat Dir braucht manner Tippen ass, firwat gitt Dir den Dossier net nëmmen an $ PATH? Oder maacht e Symlink op mpiexec aus iergendengem Ordner an $ PATH? Oder (mäi Liiblings) setzt den Alias ​​an e Skript, dat Dir am Ruffskript bréngt?

2
ответ дан 26 January 2012 в 22:41

В Бэш 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"

вместо:

foo="echo test"

. Затем выполните либо:

find . -type f -exec sh -c "eval $foo" \;

, либо:

find . -type f -exec sh -c "echo `$foo`" \;
13
ответ дан 26 January 2012 в 22:41

Shellfunktiounen an Aliasen sinn op d'Schuel limitéiert a funktionnéieren net an ausgefouert Shellskripter. Alternativen fir Äre Fall:

  • (wann Dir Iech net beméit mpiexec amplaz petsc ze benotzen] Füügt $ HOME / petsc-3.2-p6 / petsc-arch / bin op Är PATH Variabel. Dëst kann gemaach ginn andeems Dir ~ / .profile ännert an derbäi:

     PATH = "$ HOME / petsc-3.2-p6 / petsc-arch / bin: $ PATH"
     

    Umelden fir dës Ännerungen anzewenden

  • Erstellt de Verzeechnes ~ / bin an

    • maacht e Wrapper Skript mam Numm petsc enthält:

       #! / Bin  / sh
      exec ~ / petsc-3.2-p6 / petsc-arch / bin / mpiexec "$ @"
       
    • wann de Programm et erlaabt, kënnt Dir de Shellscript iwwersprangen an e Symlink mat dem Kommando maachen:

       ln -s ~ / petsc-3.2-p6 / petsc-arch / bin / mpiexec ~ / bin / petsc
       
15
ответ дан 26 January 2012 в 22:41
  1. В .bash_aliases :

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

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

  2. В Терминале: исходный .bash_aliases

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

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

5
ответ дан 26 January 2012 в 22:41

Вы можете заставить 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
10
ответ дан 26 January 2012 в 22:41
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, заставив его думать, что это сценарий оболочки.

10
ответ дан 26 January 2012 в 22:41
  1. Используйте свои псевдонимы в сценарии оболочки.
  2. Создайте сценарий в текущей интерактивной оболочке вместо его выполнения.

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

source script.sh
3
ответ дан 26 January 2012 в 22:41

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

пример: my.sh

#!/usr/bin/env sh

alias k="kubectl --kubeconfig ~/shop/config"
k version
./my.sh

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

sh my.sh
0
ответ дан 5 January 2021 в 23:46

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

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