我有一个可执行文件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
作为命令编写一个名为 的 shell 脚本文件。在为我的 shell 脚本赋予适当的权限(使用chmod
)后,我尝试运行该脚本。但是,它给了我以下错误:
./script: line 1: petsc: command not found
我知道我可以只写文件的完整路径mpiexec
,但每次我想写新脚本时都写完整路径很麻烦。有没有办法petsc
在脚本文件中使用我的别名?有没有办法编辑我的.bashrc
或.bash_profile
来实现这一点?
答案1
一些选项:
在您的 shell 脚本中使用完整路径而不是别名。
在你的shell脚本中,设置一个变量,不同的语法
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
,因此在我看来,前三个中的一个会更好。
答案2
别名已被弃用,取而代之的是 shell 函数。从bash 手册页:
对于几乎所有用途来说,别名都被 shell 函数所取代。
要创建一个函数并将其导出到子 shell,请将以下内容放入~/.bashrc
:
petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc
然后您就可以从您的 shell 脚本中自由调用您的命令。
答案3
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).
因此,对于那些希望在 shell 脚本中使用实际别名而不是替代方法的人来说,这个问题的真正答案是:
#!/bin/bash
shopt -s expand_aliases
alias foo=bar
foo whatever
至于为什么我想要这样做:由于特殊情况,我需要欺骗 Dockerfile 让它认为它是一个 shell 脚本。
答案4
Shell 函数和别名仅限于 Shell,在执行的 Shell 脚本中不起作用。您的情况的替代方案:
(如果您不想使用
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