问题描述
我有一个可执行文件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
来实现这一目标?
最佳解决办法
-
在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
,因此,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