我的问题不是如何启用非交互式 shell 中的别名,而是为什么在非交互式 shell 中,别名默认是被禁用的。
我的远程主机被调用calvino
,经过一些配置后,我只需输入以下内容即可打开连接:
$ calvino
我在 上定义了一些有用的别名calvino
,例如:
alias now='date "+%T"'
当我尝试now
在远程主机上执行时出现以下错误:
$ calvino now
bash: now: command not found
我最终设法使它在 中移动calvino
事物.bashrc
。
我的问题是,为什么在非交互式 shell 中别名默认是被禁用的?
答案1
为什么非交互式 shell 中别名默认是被禁用的?
研究完这个问题后,我发现远程 shell 的处理方式不同。虽然非交互式 Bash shell 通常不会在启动时运行 ~/.bashrc 命令,但当 shell 由远程 shell 守护进程调用时,会出现特殊情况:
Bash 尝试确定何时将其标准输入连接到网络连接来运行,例如由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 执行时。如果 Bash 确定它以这种方式运行,它会从 ~/.bashrc 读取并执行命令(如果该文件存在且可读)。如果以 sh 形式调用,它不会执行此操作。可以使用 --norc 选项来禁止此行为,可以使用 --rcfile 选项来强制读取另一个文件,但 rshd 和 sshd 通常都不会使用这些选项来调用 shell 或允许指定它们。
...
我认为在运行(非交互式)远程命令时获取 .bashrc 的主要好处是可以运行 shell 函数。但是,典型的 .bashrc 中的大多数命令仅在交互式 shell 中相关,例如,除非 shell 是交互式的,否则别名不会展开。
...
典型 .bashrc 中的大多数语句仅对交互式 shell 有用 - 在使用 rsh 或 ssh 运行远程命令时则无用。在大多数此类情况下,设置 shell 变量、别名和定义函数都不是必需的 - 如果使用 scp 或 sftp 等程序传输文件,则将任何文本打印到标准输出都会造成严重危害。验证当前 shell 为非交互式后退出是 .bashrc 最安全的行为。
请阅读下面的源链接以了解更多讨论。