我正在尝试执行以下命令,但没有成功识别“py3start”或“py3test”别名命令 - (我引入了“py3test”用于测试目的,以检查是否在使用它之前显式设置别名有任何区别):
command = "echo $SHELL; py3start; alias py3test='source ~/.venv/python3/bin/activate'; py3test"
stdout, stderr, status = connection.exec_command(command=command, timeout=timeout)
请有人帮我弄清楚为什么即使使用的 shell 是 /bin/bash 也无法识别别名,别名在 ~/.bashrc 和 ~/.bash_profile 文件中定义如下,并且 ' 的输出alias -p' 通过相同的 paramiko 会话包含上述别名(请参阅最后一个屏幕截图)。
这些是目标虚拟机上 ~/.bashrc 和 ~/.bash_profile 文件的内容 - 我在其中设置别名 py3start。
[root@VM ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias py3start='source ~/.venv/python3/bin/activate'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
[root@VM ~]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
alias py3start='source ~/.venv/python3/bin/activate'
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
[root@VM ~]#
当命令中包含“alias -p”时,请参阅下面的输出 - 显然,它在这里找到别名,但当我尝试使用它们时仍然找不到它们:
command = "echo $SHELL; py3start; alias py3test='source ~/.venv/python3/bin/activate'; alias -p; py3test"
stdout, stderr, status = connection.exec_command(command=command, timeout=timeout)
stderr = {str} 'bash: py3start: command not found\nbash: py3test: command not found\n'
答案1
至少有两个问题。引用man bash
:
当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项
在执行该行或复合命令上的任何命令之前,Bash 始终读取至少一个完整的输入行以及构成复合命令的所有行。别名在读取命令时展开,而不是在执行命令时展开。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效。
所以你两者都需要
shopt -s expand_aliases
和后面的换行符alias py3test=...