当前位置: 首页>>技术问答>>正文


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

, , ,

问题描述

我有一个可执行文件mpiexec,其完整路径为~/petsc-3.2-p6/petsc-arch/bin/mpiexec。由于我想在不同的目录中执行此命令(无需重新键入整个路径),我在家中的.bashrc文件中设置了一个别名:

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

这允许我通过键入以下内容轻松地在命令提示符下执行此mpiexec文件:

petsc myexecutable

我尝试使用我的新别名petsc作为命令编写一个名为script的shell脚本文件。在为我的shell脚本提供适当的权限(使用chmod)后,我尝试运行该脚本。但是,它给了我以下错误:

./script: line 1: petsc: command not found

我知道我可以编写mpiexec文件的完整路径,但每次编写新脚本时编写完整路径都很麻烦。有没有办法可以在脚本文件中使用我的别名petsc?有没有办法可以编辑我的.bashrc.bash_profile来实现这一目标?

最佳解决办法

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

次佳解决办法

不推荐使用别名以支持shell函数。从bash手册页:

For almost every purpose, aliases are superseded by shell functions. 

要创建一个函数并将其导出到子shell,请将以下内容放在~/.bashrc中:

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

然后,您可以从脚本中自由调用命令。

第三种解决办法

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"
    

    Re-login应用这些更改

  • 创建目录~/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
      

第四种办法

在bash 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"

代替。然后执行以下任一操作:

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

要么:

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

第五种办法

您可以将以下代码放在.bash_aliases中:

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

然后你必须source .bash_aliases文件。然后称它为:petsc arg

优点:您不需要bash_aliases中的export -f petsc .Aliases已被弃用,但我认为仅使用.bash_aliases不是。

第六种办法

您可以强制bash使用-i标志将脚本作为交互式shell执行。这将告诉您的.bashrc file定义别名和其他功能。

例:

~ $ 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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1080.html,未经允许,请勿转载。