问题描述
本来之前在树莓派上配置了几个Alias指令(如本例中sdroff),快速控制几个Service的开关。用的时候可以先ssh到树莓派上,然后输入指令回车,再登出。
最近在计算机上试图直接在ssh后面跟着要执行的指令来简化流程,所以直接执行 ssh rasp sdroff ,但发现不能正常工作:“sdroff: command not found”。
直接在ssh后跟alias指令提示错误另外,在手机上用快捷指令(捷径/Shortcuts)上配置使用内置的SSH运行脚本的时候,bash会提示我未找到命令。
通过捷径(Shortcuts)运行sdroff会报错然而如果登陆进SSH再输入sdroff,就能正常执行指令:
登陆后再输入sdroff则执行正常查找资料
查找资料后发现,bash在非交互模式下不会展开别名。
解决方案有几个:一是在SSH直接运行命令的时候,通过参数指定使用交互方式启动bash(@Matei David);二是在.bashrc等启动过程中会被读取的文件(bash启动读取的文件顺序)且会被执行的section中,使用shopt指令显式允许alias展开,并且要保证alias定义语句也能被执行到;三是将alias改写成一个sh脚本,然后调用这个脚本来间接实现效果。
问题解决
由于我在手机上也需要使用这个别名,故采用了第二种方案。
一般在.bashrc中,会有一个判断语句来判断当前是交互式Shell还是非交互式Shell。若为非交互式Shell,则直接跳过后续指令,不做任何事情。所以将shopt和alias定义都提前到判断语句之前,问题解决。
.bashrc文件开头,判断是否交互式的语句 将shopt语句和alias定义语句插入到交互式检查之前 问题解决总结
在解决这个问题的过程中,了解了一部分bash的启动文件顺序,也了解了bash在不同的模式下对alias的不同行为,同时也了解了shopt选项的存在。
另外,解决方案二可能会来带来一些问题,因为非交互模式也包括作为解释器运行sh脚本的情况。所以如果采用这种方案,会导致bash作解释器运行脚本的时候也展开Alias。所以要确保了解可能的结果之后,再进行修改。
关键词
SSH Alias 指令不存在 交互式 展开
网友评论