记录一个关于Linux命令行alias别名的问题

Linux同时安装有Python2和Python3,由于自己编程只用Python3,因此设置了如下的aliases(~/.bash_aliases):

alias python='/usr/bin/python3'
alias pip='/usr/bin/pip3'

最近想在Linux环境下基于Python3学习MPI并行,安装MPICH和mpi4py后照网上教程抄了这么一个helloworld.py:

"""
mpi4py测试
"""
from mpi4py import MPI

comm = MPI.COMM_WORLD
comm_rank = comm.Get_rank()
comm_size = comm.Get_size()

print(f"hello, world: {comm_rank}/{comm_size}")

运行时发现一个问题,命令行调用 mpiexec -n 4 python helloworld.py 总是报各种稀奇古怪的错误,比如没有安装mpi4py模块(用 pip show mpi4py 检查已正确安装)、docstring中的非ASCII字符未指定编码(文件已用UTF-8编码)、f-string语法错误(Python3.6的语法糖不让吃了?)。而如果不用 mpiexec ,直接命令行调用 python helloworld.py 却没有任何错误(当然这样只能显示一行 "hello, world: 0/1",没有真正开启多进程并行)。真是咄咄怪事,一时间百思不得其解。

反复尝试无果后,决定彻底放弃“过于复杂”的helloworld.py,就让Python简单打印个版本号,MPI并行版本是 mpiexec -n 4 python --version,串行版本是 python --version,结果这么一试就发现问题了:
记录一个关于Linux命令行alias别名的问题_第1张图片

可以看出在 mpiexec 命令中,~/.bash_aliases 文件中设置的别名 alias python='/usr/bin/python3' 没有起到作用,这里的 python 还是按照Linux系统默认指向了 python2。而如果在以上 mpiexec 命令中不使用别名,手动指定 python2python3,结果也就可想而知了:
记录一个关于Linux命令行alias别名的问题_第2张图片


是不是因为 alias python='/usr/bin/python3' 是用户自定义的别名(位于 ~/.bash_aliases 文件中),所以在某些情况下“效力”不够导致不起作用?不是alias ll='ls -alF' 是Linux系统直接定义的别名(位于 ~/.bashrc 文件中),可 llmpiexec 命令中一样不起作用:
记录一个关于Linux命令行alias别名的问题_第3张图片


是不是因为 mpiexec 来自第三方库(MPICH),所以对alias别名机制支持不到位?不是,ltrace是Linux自带的用于跟踪进程调用库函数情况的命令,该命令一样不认alias别名,python 还是按系统默认指向 python2(注意第一条ltrace 命令执行后显示的Python版本号 2.7.15rc1):
记录一个关于Linux命令行alias别名的问题_第4张图片


是不是因为 mpiexecltrace 这样调用其它命令的命令比较“高级”,所以不认alias别名?貌似也不是,time是Linux自带的用于统计给定命令所花费总时间的命令,该命令就可以认alias别名:
记录一个关于Linux命令行alias别名的问题_第5张图片


折腾到此为止,好吧,我还是没搞明白上面这些现象是因何而来?为何有些命令认alias别名,有些就不认?Google、StackOverflow、百度、SegmentFault都没查出个所以然(当然,多半是因为我自己太菜,不知道该怎么准确描述这问题)。最后,为避免以后再踩坑,特意把这问题记录下来,至少折腾这么半天我知道了 mpiexec 命令后面还是得老老实实写全 python3 ,一个字符也不能贪污:
记录一个关于Linux命令行alias别名的问题_第6张图片

你可能感兴趣的:(Linux)