美文网首页
在SSH后直接跟指令时,Alias不生效的问题(.bashrc中

在SSH后直接跟指令时,Alias不生效的问题(.bashrc中

作者: xun66 | 来源:发表于2020-04-16 08:51 被阅读0次

    问题描述

    本来之前在树莓派上配置了几个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 指令不存在 交互式 展开

    相关文章

      网友评论

          本文标题:在SSH后直接跟指令时,Alias不生效的问题(.bashrc中

          本文链接:https://www.haomeiwen.com/subject/wkqlvhtx.html