如何在 shell 脚本中运行别名?

如何在 shell 脚本中运行别名?

我有一个可执行文件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

一些选项:

  1. 在您的 shell 脚本中使用完整路径而不是别名。

  2. 在你的shell脚本中,设置一个变量,不同的语法

    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,因此在我看来,前三个中的一个会更好。

答案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
      

相关内容