У меня есть исполняемый файл 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
, чтобы это произошло?
E puer Optiounen:
An Ärem Shell-Skript benotzt de komplette Wee anstatt en Alias.
An Ärem Shell-Skript, setzt eng verännerlech, aner Syntax
petsc = '/ home / your_user / petsc-3.2-p6 / petsc-arch / bin / mpiexec'
$ petsc myexecutable
Benotzt eng Funktioun an Ärem Skript. Wahrscheinlech besser wann petsc
komplex ass
Funktioun petsc () {
Kommando 1
Kommando 2
}
petsc myexecutable
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.
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.
(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?
В Бэш 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`" \;
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
В .bash_aliases
:
petsc {
~ / petsc-3.2-p6 / petsc-arch / bin / mpiexec "$ @"
}
Или поместите функцию в .bashrc
. Обычно в .bashrc
хранятся только настройки конфигурации bash
.
В Терминале: исходный .bash_aliases
petsc arg (s)
Преимущество: вам не требуется export -f petsc
в .bash_aliases
. Псевдонимы устарели, но можно использовать .bash_aliases
для функций.
Вы можете заставить 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
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, заставив его думать, что это сценарий оболочки.
Итак, если у вас есть файл с именем script.sh
с вашими командами, которые включают использование псевдонимов, просто введите:
source script.sh
Пожалуйста, используйте #! / 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