У меня есть исполняемый файл 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
сделать это?
.bash_aliases
? Также как насчет наложения абсолютного пути вместо относительного пути, какalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Ответы:
В вашем сценарии оболочки используйте полный путь, а не псевдоним.
В вашем сценарии оболочки установите переменную, другой синтаксис
Используйте функцию в вашем скрипте. Наверное, лучше, если
petsc
это сложноИсточник ваши псевдонимы
Вы, вероятно, не хотите, чтобы ваш источник
.bashrc
, поэтому, IMO, один из первых 3 будет лучше.источник
shopt -s expand_aliases
в том же сценарии.|
. Здесь используйтеshopt -s expand_aliases
& локальный псевдоним, например,alias myalias='echo abc|rev'
- требует перенос строки перед использованием (см. Псевдонимы вman bash
). Пункт 4: исходный файл может предотвратить неинтерактивное выполнение, т. Е. В сценарии. Ищите раноexit
илиreturn
, например[ -z "$PS1" ] && return
(проверяет, не установлено ли основное приглашение, указывающее на неинтерактивную оболочку) или может быть проверка наi
вход$-
($-
содержит параметры оболочки,i
означает интерактивную). Смотритеman bash
для этих переменных.Псевдонимы устарели в пользу функций оболочки. Со
bash
страницы руководства:Чтобы создать функцию и экспортировать ее в подоболочки, добавьте в свой файл следующее
~/.bashrc
:Тогда вы можете свободно вызывать свою команду из ваших скриптов.
источник
"$@"
только для обработки аргументов.Функции оболочки и псевдонимы ограничены оболочкой и не работают в исполняемых скриптах оболочки. Альтернативы для вашего случая:
(если вы не хотите использовать
mpiexec
вместоpetsc
) Добавить$HOME/petsc-3.2-p6/petsc-arch/bin
к вашейPATH
переменной. Это может быть сделано путем редактирования~/.profile
и добавления:Повторно войдите, чтобы применить эти изменения
Создать каталог
~/bin
исделать скрипт-оболочку с именем,
petsc
содержащим:если программа это позволяет, вы можете пропустить скрипт и создать символическую ссылку, используя команду:
источник
В Баш 4 вы можете использовать специальную переменную:
$BASH_ALIASES
.Например:
В качестве альтернативы определите как переменную, затем используйте подстановку команды или
eval
.Так, например, вместо определения псевдонима, такого как:
определить это как:
вместо. Затем выполните это:
или же:
источник
${BASH_ALIASES[alias]}
это хороший вариант. В противном случае мне пришлось редактировать много строк моего .bash_aliases, чтобы применить другие вещи. Спасибо.Вы можете заставить bash выполнить ваш скрипт в виде интерактивной оболочки с флагом -i. Это скажет вашему файлу .bashrc определить псевдонимы и другие функции.
Пример:
Больше информации:
источник
.bashrc
также читается во время неинтерактивного выполнения команды SSH (поэтому вверху есть проверка на интерактивность)Таким образом, реальный ответ на этот вопрос для тех, кто хочет использовать реальные псевдонимы в сценариях оболочки вместо их альтернатив:
Что касается того, почему я хотел бы сделать это: из-за необычных обстоятельств мне нужно обмануть Dockerfile, думая, что это скрипт оболочки
источник
В
.bash_aliases
:Или вставьте функцию
.bashrc
. Обычно.bashrc
только в конфигеbash
хранятся настройки .В терминале:
source .bash_aliases
petsc arg(s)
Преимущество: Вам не нужно
export -f petsc
в.bash_aliases
. Псевдонимы устарели, но использование.bash_aliases
для функций в порядке.источник
Поэтому, если у вас есть файл, вызываемый
script.sh
вашими командами, которые включают использование псевдонимов, просто введите:источник
.
илиsource
buiiltin заставляет текущую оболочку выполнять все команды в нем. Если расширение псевдонима произойдет в оболочке, в которой.
илиsource
выполняется, это происходит. Тем не менее, важно понимать, что этот метод полезен только иногда, потому что часто нужно или нужно выполнить скрипт в его собственной оболочке, со своей собственной средой. Сценарии оболочки, написанные с намерением выполнить обычным способом, обычно не следует использовать вместо этого - они часто не будут работать правильно.(РЕДАКТИРОВАТЬ: удалены функции, так как я неправильно прочитал вызов mpiexec.)
Если единственное, что вам нужно, это меньше печатать, почему бы вам просто не поместить папку в $ PATH? Или сделать символическую ссылку на mpiexec из какой-либо папки в $ PATH? Или (мой любимый) поместить псевдоним в сценарий, который вы используете в вызывающем сценарии?
источник
"$@"
.